2015-05-06 2 views
1

Я пытаюсь заполнить свой файл символами 'a', и мне нужно использовать tu aio_write. Вот моя писанина функцияaio_write и memset неверный аргумент и ошибка сегментации (core dumped)

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 Error) так моя RV == -1 и я получаю PError печататься И когда я использую memset(&aiorp, 'a', sizeof(struct aiocb));// < --- Я получаю Ошибка сегментации (ядро сбрасывается) Почему мои оба memset не работают? Также я добавить свой полный код

#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; 
} 

ответ

1

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

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 тин его на все нули с вышеуказанным вызовом.)