我在C中编写了一个等待事件的程序,然后按system()
功能运行外部系统命令.
while( true ){
wait_for_event();
system("cmd");
}
Run Code Online (Sandbox Code Playgroud)
我有一个严重的问题,这cmd
是一个繁重的命令,需要几秒钟才能完成,我的应用程序在这段时间内错过了一些事件.
所以我决定把这个system
非常重的函数移到另一个程序中,所以我改变了我的程序如下:
while( true ){
wait_for_event();
write_to_fifo("cmd");
}
Run Code Online (Sandbox Code Playgroud)
并写了另一个程序:
while(true){
system(read_from_pipe());
}
Run Code Online (Sandbox Code Playgroud)
但它没有帮助,因为如果生产者(第一个程序)的写入速度比消费者(第二个程序)快,那么消费者会错过一些数据!
有没有办法解决这个问题?
您应该将代码返回到其原始格式 - 即,调用第二个程序的单个程序 - 除了您使用system(3)
调用替换popen(3)
调用.现在,调用程序可以将用于事件检查的调用与来自外部程序的读取行交错.
Unix管道机制确保缓慢的消费者将导致快速生产者在管道变满时写入时等待.
您可能还希望查看该fileno(3)
函数,结合select(2)
或poll(2)
为了使外部程序的读取异步,以便它永远不会阻塞调用程序.