aio_write 和 memset 无效参数和分段错误(核心转储)

Posted

技术标签:

【中文标题】aio_write 和 memset 无效参数和分段错误(核心转储)【英文标题】:aio_write and memset invalid argument and Segmentation Fault (core dumped) 【发布时间】:2015-05-06 13:46:37 【问题描述】:

我正在尝试用“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 ) ); // Invalid argument (Error da_aio_write) 所以我的 rv == -1 我得到 perror 打印 当我使用memset(&amp;aiorp, 'a', sizeof( struct aiocb )); // Segmentation Fault (core dumped) 为什么我的两个 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 的每个字节设置为'a' 的ASCII 值,您的第一个变体:

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

很好。 (不过,您不需要强制转换为 void *,并且可以将大小重写为 sizeof(*aiorp) 以遵循通用模式。)

但是你为什么要这样做呢?这就是控件结构,它现在包含大量由'a' 字节组成的(无意义的)数据,除了您之后显式覆盖的值。

难怪你会得到一个EINVAL,其中“aio_offsetaio_reqprioaio_nbytes 中的一个或多个是无效的”,根据手册页:aiorp-&gt;aio_erqprio0x61616161

您希望将数据缓冲区设置为包含'a's:

memset(buf, 'a', count);

(但鉴于您的 aiocb 结构已分配在 main 的本地存储中,因此未初始化,您可能会考虑使用上述调用将 memset 全部归零。)

【讨论】:

以上是关于aio_write 和 memset 无效参数和分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

memset函数

webform组合查询和分页

springboot整合mongodb复杂查询和分页查询

JPA 排序和分页

具有总记录和分页的单个 SQL 查询

memset和wmemset用法记录