msleep(毫秒)与 msleep_interruptible(毫秒)

问题描述 投票:0回答:1

我不明白这些的用法:

msleep
msleep_interruptible
...我知道一个是可中断的,另一个是不可中断的,但在我实际看到的地方找不到某些用法。我尝试使用 msleep 函数调用线程并打印说“Hello!”和 msleep(msleep_interruptible) 之后,但看不出任何区别。谁能帮助我,可以举个例子吗?

c linux signals sleep
1个回答
6
投票

区别在于当发出信号(例如 SIGINT)并且为该信号设置信号处理程序时会发生什么。

  • msleep
    回去睡觉。
  • msleep_interruptible
    返回给调用者(用一个非零值表示剩余的睡眠时间)。

可中断睡眠的示例:

$ perl -Mthreads -E'
   my $stime=time;
   async { sleep(3); kill INT => $$; }->detach();
   $SIG{INT} = sub { warn "Got INT signal after ".(time-$stime)."\n"; };
   sleep(5);
   say time-$stime;
'
Got INT signal after 3
3

它休眠了 3 秒而不是 5 秒,因为它被处理的信号中断了。另一个版本将打印以下内容:

Got INT signal after 3
5

换句话说,信号处理程序会以任何一种方式被调用,但即使有信号进入,一个版本也不会返回。

© www.soinside.com 2019 - 2024. All rights reserved.