c - 即使运行它们的进程很忙,signal()和alarm()也能工作吗?或者我应该在另一个专用进程上运行它?

标签 c unix signals alarm

我目前正在实现一个生产者/消费者问题计划。我有一个父进程和几个子进程。一切正常,但现在我需要让我的程序每 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/

相关文章:

c - 为什么sigaction说键盘快捷键发送的信号来自PID 0?

linux - c - 无法在 Linux 中订阅新的信号处理程序

android - GetMethodID 找不到 id - android JNI

linux - 为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?

c - 如何在 C 中将缓冲区表示为链表

unix - awk - 太多打开的文件问题/日期解析

php - bash脚本中的转义字符

c - 在 Linux 上处理多线程断管情况的服务器端套接字最佳实践是什么?

c - 发送结构数组时程序崩溃

objective-c - 内存管理 : NSString's stringWithCString:encoding: