C linux中的报警和睡眠

C linux中的报警和睡眠,c,linux,unix,C,Linux,Unix,是否有人关心sleep()和alarm()的组合?我一直听说这样做是不好的,因为他们可能都依赖同一个计时器,并且彼此冲突 我认为使用alarm()容易出错,希望看到不同的解决方案或任何想法,以便我可以使用与睡眠非常兼容的东西从代码中删除报警。当您使用睡眠时,进程进入睡眠状态的时间以毫秒为单位,报警将在睡眠后返回剩余的秒数。报警在所述时间后终止进程 是的,睡眠和报警将使用相同的计时器。因此,我们有责任计算在报警()后发生睡眠()时的剩余秒数 例如: 如果你使用 alarm(5);---------

是否有人关心
sleep()
alarm()
的组合?我一直听说这样做是不好的,因为他们可能都依赖同一个计时器,并且彼此冲突


我认为使用
alarm()
容易出错,希望看到不同的解决方案或任何想法,以便我可以使用与睡眠非常兼容的东西从代码中删除报警。

当您使用
睡眠时,进程进入睡眠状态的时间以毫秒为单位,
报警将在
睡眠
后返回剩余的秒数。
报警
在所述时间后终止进程

是的,
睡眠
报警
将使用相同的计时器。因此,我们有责任计算在
报警()
后发生
睡眠()
时的剩余秒数

例如: 如果你使用

alarm(5);---------------> An alarm is set for 5 seconds.

sleep(3);---------------> Process goes to sleep state for 3 seconds.

alarm(7);---------------> This alarm returns the seconds remaining after sleep is set i.e it returns 2.
然后将
报警设置为7秒。当进程时间超过12秒时,进程将在12秒后终止

如果
睡眠
时间更长

例2:

alarm(5);

sleep(7);

然后,进程在5秒后终止。

混合
睡眠
报警
可能存在多个兼容性问题

第一个是
睡眠
将被信号中断,比如来自
报警
的信号。因此,你必须经常检查你的
睡眠时间
是否达到了你想要的睡眠时间

但第二个潜在的更大问题是,在某些系统上,
sleep
可能在内部实现为:
报警;暂停()
未正确重置之前的
报警
,这实际上意味着
睡眠
将破坏您可能设置的任何报警

如果你的功能真的依赖于睡眠和获取彼此独立的警报,请考虑使用
setitimer
设置你自己的计时器,并围绕此构建你自己的计时框架。进入睡眠状态时,将定时器设置为睡眠时间和暂停时间(检查是否被其他信号提前唤醒),然后将定时器设置为任何警报

我认为使用alarm()容易出错,希望看到不同的解决方案或任何想法,以便我可以使用与sleep非常兼容的东西从代码中删除alarm

sleep()
是使用
SIGALRM
实现的,
nanosleep()
不是,因此我建议将
sleep()
替换为
nanosleep()

阅读手册页


最近的Linux还提供了(和
ppoll(2)
select(2)
pselect(2)
),,,,,,,,,,

您试用过吗?你的观察结果是什么?我已经在我的代码中使用了这些东西..它对我有效..但有时它有未定义的行为..我想用timer\u create或setitimer或任何东西删除警报..我的意思是我不知道什么会有效。@HAL在这种情况下,在这里尝试它并不是一个做出好决定的好方法,因为它依赖于系统。他可能很幸运,而且他的系统没有冲突。然后尝试只会得出错误的结论。具体来说,对于Linux来说,除了明显的(信号中断睡眠,但这与使用报警无关——其他信号无论如何都会中断睡眠)之外,没有什么好担心的。然而,按照标准,可以使用报警来实现睡眠。在将来,您可能需要支持一些不完全是Linux的东西,即使现在您认为您永远也不会支持。如果发生这种情况,你会为自己的近视而生气。你可以用它来代替睡眠。IIRC它不应该干扰
报警
调用。是的,我可以理解。但是这件事会很复杂。你有没有办法让我用与睡眠非常兼容的东西从我的代码中删除报警。这种行为在任何地方都能保证吗?报警手册页简单地说,
sleep(3)可以使用SIGALRM实现;混合调用alarm()和sleep(3)是一个坏主意。
没有描述您描述的(正常)交互。是的,我可以使用setitimer来代替alarm。但我认为setitimer、alarm、sleep属于同一类,有时会给出未定义的行为。但是setitimer有三个选项来设置计时器,如timer\u REAL、timer\u PROF、,TIMER_VIRTUAL.有人更适合睡眠吗?嗯,我的意思是用你自己的东西来代替闹钟和睡眠。不只是其中一个。@Art..同意..但我不想碰睡眠。从我的代码中替换所有睡眠会很忙。对我来说,替换警报很容易。根据我的观察,我可以使用Timer_create(为特定进程创建计时器)。但我发现它很复杂。你还有其他建议吗。“替换所有睡眠”?我对此有两种反应。一种是,您只需创建一个行为相同的函数,然后用该函数替换所有用于睡眠的函数调用。这很琐碎。第二个反应是:为什么代码中有那么多睡眠?在过去的20年里,我可以数一数我用手指睡觉的次数,这些几乎都是我懒得做正确同步的一次性代码的情况。在这个阶段,我不能用nanosleep代替睡眠。你有没有办法代替闹钟。@user2814189你可以将
sleep()
替换为
nanosleep()
使用库插入。或者,使用
setitimer()
重新实现
alarm()
。更好的方法是同时避免这两个函数,因为它们与线程的交互不好…因为sleep()和setitimer()是两者都是用SIGALRM实现的,所以替换是无益的。除了setitimer()之外,您还有其他建议吗?术语库插入是未知的否