memset用'a'填充文件

时间:2015-05-05 08:24:13

标签: c asynchronous memset

差不多两个小时我的程序出了问题。我正在尝试用字符'a'填充我的文件,但我的程序不起作用。这是我的写作函数

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 ) );
   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!!!\n"); // my program print this (Invalid argument)
       exit(1);
       return rv;
   }
   return rv;
}

某种程度上rv失败(rv == -1)而我没有得到预期的结果。 Alsko我添加完整的程序

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

#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("Failas sukurtas, nes jo nebuvo\n");
       dskr2 = open( name, O_WRONLY | O_CREAT, 0644);
   }else{
       printf("Toks failas jau yra!\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 ) );
   aiorp->aio_fildes = d;
   aiorp->aio_buf = buf;
   aiorp->aio_nbytes = count;
   aiorp->aio_offset = 0;
   rv = aio_write( aiorp );

   if( rv == -1) {
       printf("ERROR!!! ");
       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];
        memset(buffer, 0, sizeof buffer);
        d = da_open(argv[1]);
        da_aio_write( d, &aior, buffer, sizeof(buffer) );
        da_test_wait( &aior );
        da_close( d );
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

memset()传递了错误的参数。该行应

memset(&aiorp, 'a', sizeof( struct aiocb ));

这里在main()函数中你没有为缓冲区分配任何内容。

da_aio_write()中的代码将是

memset(aiorp->aio_buf, 'a', count);

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

不需要:aiorp->aio_buf = buf;