在Linux上使用C,每次使用write()函数将数据写入缓冲区时,如何触发信号处理程序。处理程序将在执行时读取写入缓冲区的所有数据。
答案 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模型。