我目前正在实现一个生产者/消费者问题计划。我有一个父进程和几个子进程。一切正常,但现在我需要让我的程序每 k
毫秒输出我的程序正在执行的任务的进度。
起初我认为也许只是使用 signal()
和 alarm()
函数,但从我一直在进行的一些初步测试来看这似乎还不够。我查看了几个日志文件,似乎 onAlarm()
没有被调用。我想这与 parent 和 child 都“忙”而没有收到事件有关?或者即使他们很忙,他们也应该能够在 onAlarm() 上接收调用?我看到的唯一解决方法是创建另一个流程,该流程具有单一责任来处理此问题。
这是我的“事件”代码:
void onAlarm() {
signal(SIGALRM, onAlarm);
alarm(0.01);
fprintf(outputFile, "ALAAAAAAAAAAAAAARMMMMMMMMMMM: %d\n", numberOfBytesRead);
}
int main() {
signal(SIGALRM, onAlarm);
alarm(0.01);
...
}
最佳答案
你的主要问题是alarm()
需要整数秒 - 并且 alarm(0)
用于取消任何未完成的警报。
自然的后续问题是:
How can I do sub-second waiting?
我不确定批准的方式是什么。在某些系统上,存在微 sleep (usleep()
) 调用,但这不是 POSIX 2008 的一部分。 POSIX 中的 usleep()
的直接类似物出现成为nanosleep()
.
有一个sigtimewait()
这可能可以用来达到效果。 (您也许可以使用 setitimer()
和 getitimer()
代替 usleep()
。)
所有这些的困难在于,您要么是同步的(在等待信号到达时无法继续工作),要么没有发送信号。我没有立即看到 POSIX 亚秒级警报机制,该机制允许您在等待超时时继续工作。
关于c - 即使运行它们的进程很忙,signal()和alarm()也能工作吗?或者我应该在另一个专用进程上运行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4420095/