我应该何时使用sleep()
并重新配置SIG_ALRM
?
例如,我想在某个特定时间安排某项任务。我可以生成一个内部有sleep()
调用的线程,当sleep()
返回时,执行一些任务,或者我可以为SIG_ALRM指定一个处理程序并在警报中断内执行任务。他们是否采用相同的CPU使用率和时间? (除了线程)。
我做了一些"测试"使用ps
命令查看进程,向我显示 CPU%和 0 的 CPU TIME ,但我'我想知道我是否遗漏了某些东西,或者我正在查看错误的数据。
答案 0 :(得分:2)
请注意,您在信号处理程序中执行的操作非常有限。您只能调用某些POSIX函数,并且不允许使用大多数C库。当然不是任何可能分配或释放内存或执行I / O的C函数(可以使用一些POSIX I / O调用)。
睡眠线程可能是您最简单的方法。如果您使用nanosleep
,它根本不会产生信号,因此您不会需要处理这些处理程序。
如果你的程序正在运行,一个常见的模式是有一个中央工作循环,在那个循环中你可以定期检查时间,看看你是否应该运行你的延迟工作。或者您可以跳过检查时间并检查标志变量,而不是SIG_ALARM
处理程序将设置的变量。设置sig_atomic_t
变量是允许信号处理程序执行的操作之一。
睡眠任务的CPU使用率为零。它作为计时器事件进入内核,并在计时器到期时被唤醒运行。