触发信号处理程序用于I / O.

时间:2010-03-29 17:46:09

标签: c linux

在Linux上使用C,每次使用write()函数将数据写入缓冲区时,如何触发信号处理程序。处理程序将在执行时读取写入缓冲区的所有数据。

4 个答案:

答案 0 :(得分:4)

套接字通过在套接字文件描述符上启用异步模式来支持此功能。在Linux上,这是使用fcntl调用完成的:

/* set socket owner (the process that will receive signals) */
fcntl(fd, F_SETOWN, getpid());

/* optional if you want to receive a real-time signal instead of SIGIO */
fnctl(fd, F_SETSIG, signum);

/* turn on async mode -- this is the important part which enables signal delivery */
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_ASYNC);

答案 1 :(得分:2)

pipe()O_ASYNC一起使用,只要管道上有新数据,您就会在管道的读取端收到SIGIO

答案 2 :(得分:2)

我不是100%了解你想要做什么,但是 select可能就是您所需要的。等待数据写入文件/管道。您可以使用它来执行/模拟异步I / O.

答案 3 :(得分:0)

如果与write()一起使用的文件描述符不是用于FIFO,管道(as suggested by Ken Bloom),异步套接字(as suggested by mark4o),否则不会产生信号(即{ {1}}),我想你可以在将数据写入缓冲区后使用raise()向当前进程发送信号。根据您实际想要实现的目标,这可能不是最佳解决方案。


<强>更新

如果我理解正确,您希望写入文件,在写入完成时生成SIGIO信号,然后从信号处理程序中读回数据。您似乎希望将asynchronous I/O用于文件。

Asynchronous I/O on linux or: Welcome to hell中,作者描述了Linux上的各种异步I / O技术,包括使用SIGIO信号。 SIGIO信号技术不能与常规文件一起使用。

尽管前面提到的文章的作者并没有高度评价2.6内核中提供的POSIX AIO API,但您仍然可以查看它,因为它可用于提供异步读/写完成的通知通过信号和函数回调到常规文件。

Boost application performance using asynchronous I/O中,作者在介绍AIO API之前概述了基本的Linux I / O模型。