2015-05-06 4 views
0

Мой файл должен быть заполнен 0. Я хочу сделать это с помощью aio_write В результате мой файл должен выглядеть 000000000...., но в результате я получаю, что мой файл заполнен мусоромПодача файл с нулями

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ 
s|▒^@^@^@^@^@^@^@^@^@^@^@^@▒r|▒^@^@^@^@▒▒^?▒(▒▒▒▒s|▒▒ 
y▒^P^@^@^@^X▒▒▒ 
s|▒^X^@^@^@▒..... 

Я даже не представляю, что случилось. Прежде всего я использую асинхронной записи, поэтому мне нужно ждать, когда da_aio_write завершается

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_aio_write(const int d, struct aiocb *aiorp, void *buf, const int count){ 
    int rv = 0; 
    memset((void *)aiorp, 0, sizeof(struct aiocb)); 
    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 main(int argc, char *argv[]){ 
     int sk; 
     int d; 
     struct aiocb aior; 
     if(argc == 3){ 
       sk = atoi(argv[2]); 
       char buffer[MB * MB * sk]; 
       //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; 
} 

Любые идеи что я делаю неправильно? EDIT: Я знаю, что мой da_aio запись заканчивается после того, как основные, так как ehen я скомпилировать я получаю

File created 
dskr1 = 3 
AIO complete, 1048576 bytes write. 
closed 

EDIT Моего полного обновленного кода

#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, 0, sizeof(struct aiocb)); 
    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; 
} 

ответ

3
char buffer[MB * MB * sk]; 

Stack переменных автоматически не initialiased. Таким образом, ваш буфер содержит мусор. memset это 0, если это то, что вы хотите записать в файл.

+0

Спасибо, но затем я получаю это '^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^' Вот как я это сделал' memset (buffer, '\ 0', size); ' – David

+0

Пожалуйста, обновите свой вопрос с вашим новым кодом. Также включите 'da_open'. – kaylum

+2

Это ожидаемый результат. Поскольку запись всех 0 в файл создает двоичный файл, а не текстовый файл. Если вы хотите, чтобы 0 открыли файл с помощью редактора, который может просматривать в шестнадцатеричном режиме (например, emacs). Или если у вас есть 'hexdump', используйте это, чтобы просмотреть файл вместо' cat' и друзей. – kaylum

Смежные вопросы