msleep(毫秒)vs msleep_interruptible(毫秒)

时间:2012-06-18 21:21:22

标签: c linux signals sleep

我不明白这些用法的用法:msleepmsleep_interruptible ...我知道一个可中断的,另一个是不可中断的,但在我能看到的地方找不到某些用法。我尝试用msleep函数调用线程并打印说“你好!”然后,msleep(msleep_interruptible),但看不出任何差异。任何人都可以帮助我,可能有例子吗?

1 个答案:

答案 0 :(得分:4)

不同之处在于当信号(例如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

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