c – C快速生产者/缓慢消费者

我在C中编写了一个等待事件的程序,然后通过system()函数运行一个外部系统命令.
while( true ){
    wait_for_event();
    system("cmd");
}

我有一个seriuos问题,该cmd是一个沉重的命令,需要几秒钟才能完成,我的应用程序在这个时间框架内错过了一些事件.

所以我决定将系统功能,这是非常重的,移动到另一个程序,所以我改变了我的程序如下:

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

并写了另一个程序:

while(true){
    system(read_from_pipe());
}

但是没有帮助,因为如果生产者(第一个程序)的写入速度比消费者快(第二个程序),那么消费者会错过一些数据!

有没有办法处理这个问题?

解决方法

您应该将代码返回到其原始格式 – 即单个程序调用第二个程序 – 除了用popen(3)调用替换系统(3)调用.现在,调用程序可以将来自外部程序的读取行的事件检查的调用进行交织.

Unix管道机制确保缓慢的消费者将导致快速生产者在管道充满时写入时等待.

您可能还想查看fileno(3)函数,结合select(2)或poll(2),以便从外部程序异步读取,从而永远不会阻止调用程序.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...