Недопустимый аргумент aio_write и memset и ошибка сегментации (дамп ядра)

Я пытаюсь заполнить свой файл символами «a», и мне нужно использовать aio_write. Вот моя функция письма

int da_aio_write(const int d, struct aiocb *aiorp, void *buf, const int count){
   int rv = 0;
  // memset( (void *)aiorp, 'a', sizeof( struct aiocb ) ); // <--- I get Invalid argument (Error da_aio_write)

  // memset(&aiorp, 'a', sizeof( struct aiocb )); // <--- I get Segmentation Fault (core dumped)
   aiorp->aio_fildes = d;
   aiorp->aio_buf = buf;
   aiorp->aio_nbytes = count;
   aiorp->aio_offset = 0;

   rv = aio_write( aiorp );

   if( rv == -1) {
       perror("Error da_aio_write\n");
       exit(1);
       return rv;
   }
   return rv;
}

Когда я использую memset( (void *)aiorp, 0, sizeof( struct aiocb ) ); // ‹--- я получаю Недопустимый аргумент (ошибка da_aio_write), поэтому мой rv == -1 и я получаю вывод perror И когда я использую memset(&aiorp, 'a', sizeof( struct aiocb )); // ‹--- я получаю Ошибка сегментации (дамп ядра) Почему не работают оба моих мемсета? Также я добавляю свой полный код

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <string.h>
#include <aio.h>
 #include <errno.h>

#define MB 1024

int da_open(const char *name);
int da_aio_write(const int d, struct aiocb *aiorp, void *buf, const int count);
int da_test_wait( struct aiocb *aiorp );
int da_close(int fd);

int da_open(const char *name){
   int dskr;
   int dskr2;
   dskr = open( name, O_RDWR );
   if( dskr == -1 ){
       printf("File created\n");
       dskr2 = open( name, O_WRONLY | O_CREAT, 0644);
   }else{
       printf("End job!\n");
       exit(1);
   }
   printf( "dskr1 = %d\n", dskr2 );
   return dskr2;
}

int da_aio_write(const int d, struct aiocb *aiorp, void *buf, const int count){
   int rv = 0;
   //memset( (void *)aiorp, 'a', sizeof( struct aiocb ) );  // <--- I get Invalid argument (Error da_aio_write)
   //memset(&aiorp, 'a', sizeof( struct aiocb )); / <--- I get Segmentation Fault (core dumped)
   aiorp->aio_fildes = d;
   aiorp->aio_buf = buf;
   aiorp->aio_nbytes = count;
   aiorp->aio_offset = 0;

   rv = aio_write( aiorp );

   if( rv == -1) {
       perror("Error da_aio_write\n");
       exit(1);
       return rv;
   }
   return rv;
}

int da_test_wait( struct aiocb *aiorp ){
   const struct aiocb *aioptr[1];
   int rv;
   aioptr[0] = aiorp;
   rv = aio_suspend( aioptr, 1, NULL );
   if( rv != 0 ){
      perror( "aio_suspend failed" );
      abort();
   }
   rv = aio_return( aiorp );
   printf( "AIO complete, %d bytes write.\n", rv );
   return 1;
}

int da_close(int fd){
   int rv;
   rv = close( fd );
   if( rv != 0 ) perror ( "close() failed" );
   else puts( "closed" );
   return rv;
}

int main(int argc, char *argv[] ){
        int sk;
        int d;
        struct aiocb aior;
        if(argc == 3){
                sk = atoi(argv[2]);
                char buffer[MB * MB * sk];
                int size; 
                size = MB * MB * sk;
                memset( buffer, '\0', size);
                //memset(&aior, '\0', sizeof( struct aiocb ));
                d = da_open(argv[1]);
                da_aio_write( d, &aior, buffer, sizeof(buffer) );
                da_test_wait( &aior );
                da_close( d );
        }
        return 0;
}

person David    schedule 06.05.2015    source источник


Ответы (1)


Если вы хотите установить для каждого байта aiorp значение ASCII 'a', ваш первый вариант:

memset((void *) aiorp, 'a', sizeof(struct aiocb));

хороший. (Однако вам не нужно приводить к void *, и вы можете переписать размер до sizeof(*aiorp), чтобы следовать общему шаблону.)

Но почему вы хотите это сделать? Это элемент управления, структура, которая теперь содержит много (бессмысленных) данных, состоящих из 'a' байтов, за исключением значений, которые вы явно перезаписываете впоследствии.

Неудивительно, что вы получаете EINVAL, для которого «Один или несколько из aio_offset, aio_reqprio, aio_nbytes недействительны», согласно справочной странице: aiorp->aio_erqprio это 0x61616161.

Вы хотите, чтобы буфер данных содержал 'a's:

memset(buf, 'a', count);

(Но учитывая, что ваша структура aiocb размещена в локальном хранилище в main и, таким образом, неинициализирована, вы можете рассмотреть возможность memsetобнуления ее с помощью приведенного выше вызова.)

person M Oehm    schedule 06.05.2015