Мой файл должен быть заполнен 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;
}
Спасибо, но затем я получаю это '^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^' Вот как я это сделал' memset (buffer, '\ 0', size); ' – David
Пожалуйста, обновите свой вопрос с вашим новым кодом. Также включите 'da_open'. – kaylum
Это ожидаемый результат. Поскольку запись всех 0 в файл создает двоичный файл, а не текстовый файл. Если вы хотите, чтобы 0 открыли файл с помощью редактора, который может просматривать в шестнадцатеричном режиме (например, emacs). Или если у вас есть 'hexdump', используйте это, чтобы просмотреть файл вместо' cat' и друзей. – kaylum