我用C语言编写了一个等待事件的程序,然后通过system()函数运行外部系统命令。

while( true ){
    wait_for_event();
    system("cmd");
}

我对此有一个严重的问题,cmd是一个繁琐的命令,需要几秒钟才能完成,我的应用程序在此时间段内错过了一些事件。

因此,我决定将非常沉重的system函数移至另一个程序,因此,我对程序进行了如下更改:
while( true ){
    wait_for_event();
    write_to_fifo("cmd");
}

并编写了另一个程序:
while(true){
    system(read_from_pipe());
}

但这无济于事,因为如果生产者(第一个程序)的编写速度比消费者(第二个程序)快,那么消费者会丢失一些数据!

有什么办法可以解决这个问题?

最佳答案

您应该将代码恢复为原始格式(即,一个程序调用第二个程序),只是用system(3)调用替换了popen(3)调用。现在,调用程序可以将事件检查的调用与外部程序的读取行进行交错。

Unix管道机制确保缓慢的使用者将在管道满时导致快速的生产者在写入时等待。

您可能还想研究fileno(3)函数,将其与select(2)poll(2)结合使用,以使从外部程序的读取异步进行,这样它就永远不会阻塞调用程序。

10-07 19:46
查看更多