• 主页
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux
那只青蛙 2014年01月18日
异步io的问题
小伙伴们帮我看一下,为什么会段错误?
我的疑问主要是sigevent中的回调函数怎么用,这个结构体没有解释,网上的都是老版结构体的范例。

typedef struct sigevent
{
sigval_t sigev_value;
int sigev_signo;
int sigev_notify;

union
{
int _pad[__SIGEV_PAD_SIZE];

/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
thread to receive the signal. */
__pid_t _tid;

struct
{
void (*_function) (sigval_t); /* Function to start. */
void *_attribute; /* Really pthread_attr_t. */
} _sigev_thread;
} _sigev_un;
} sigevent_t;

代码如下:
#include <aio.h>
#include <signal.h>
#include <errno.h>

#define BUF_SIZE 0x1000

int ret;
void aio_completion_handler( sigval_t *ptr )
{
struct aiocb *req;


/* Ensure it's our signal */
if (1) {

req = (struct aiocb *)ptr->sival_ptr;
if(req == NULL)
{
printf("\n打印数据\n");
}
/* Did the request complete? */
if (aio_error( req ) == EINPROGRESS) {

/* Request completed successfully, get the return status */
ret = aio_return( req );
printf("\n打印数据\n");

}

}

return;
}
void sig_aio()
{
int fd;
struct sigaction act;
struct aiocb my_aiocb;

fd = open("sig_aio.c", O_RDONLY);
/*
act.sa_handler = aio_completion_handler;
act.sa_flags = SA_SIGINFO;
sigemptyset(&act.sa_mask);
*/
bzero(&my_aiocb, sizeof(struct aiocb));
my_aiocb.aio_fildes = fd;
my_aiocb.aio_buf = malloc(BUF_SIZE+1);
my_aiocb.aio_nbytes = BUF_SIZE;
my_aiocb.aio_offset = 0;

/* Link the AIO request with a thread callback */
my_aiocb.aio_sigevent.sigev_notify = SIGEV_THREAD;
my_aiocb.aio_sigevent._sigev_un._sigev_thread._function = aio_completion_handler;
my_aiocb.aio_sigevent._sigev_un._sigev_thread._attribute = NULL;
my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb;

ret = aio_read(&my_aiocb);
while(1)
sleep(1);
}

...全文
64 点赞 收藏 1
写回复
1 条回复

还没有回复,快来抢沙发~

发动态
发帖子
Linux/Unix社区
创建于2007-08-27

7025

社区成员

7.3w+

社区内容

Linux/Unix社区 应用程序开发区
社区公告
暂无公告