2016-01-11 182 views
1

我有两个进程,第一次从stdin读取并写入FIFO文件,第二次是等待来自FIFO文件的消息。如何停止fgets读取FIFO文件

我使用该程序的结构:

while(run) 
{ 
    fgets(string, sizeof(string), fp); 
} 

,当为0哨兵(运行)的变化停止过程中,它并没有真正停止,因为它停留在fgets()功能。 我该如何解决它?

我希望程序在哨兵变为0时等待消息,然后立即停止程序。

+1

执行此操作的常用方法是在调用fgets之前使用'select'来等待输入。要提早结束,请清除“运行”,然后向该进程发送一个信号。信号会中断'select',它会回到循环的顶部,看到'run'已经清除并且因此退出。 – kaylum

+0

你能说出它在这个特殊情况下的样子吗? –

+0

另一种选择是使用信号处理程序来清除“运行”。如果处理程序安装时没有“SA_RESTART”标志,则它的传送将中断同一线程中的任何阻塞读/写系统调用。尽管如此,个人而言,我会使用低级(unistd.h)I/O,非阻塞和select()。 –

回答

0

我觉得这里的FIFO在阻塞模式打开,所以在fgets()在读取调用如果数据没有可用的通话将被封锁,直到FIFO有一些新的数据。

通过在公开呼叫中使用O_NONBLOCK来避免在非阻塞模式下打开FIFO。

了解更多。 http://www.tldp.org/LDP/lpg/node19.html

这种方式如果没有数据可用带有错误返回的fgets而不是查找该调用。在接下来的while循环检查中,run将为0,因此它从此循环中出来。

+0

打开fifo我使用fopen()函数。我可以在fopen中设置这样的东西吗? –

+0

看到这个http://stackoverflow.com/questions/580013/how-do-i-perform-a-non-blocking-fopen-on-a-named-pipe-mkfifo使用open()打开fifo,然后使用fdopen ()将文件描述符转换为文件指针,然后执行所有文件操作 –

+0

我在使用fdopen时遇到了此问题:分段错误(核心转储) –