alarm(int) 可以覆盖 C 中的 sleep(int) 吗?

Can alarm(int) override sleep(int) in C?

我为 alarm() 创建了一个 signal handler。 parent 分叉出另一个没有未决警报信号的进程。因此,警报仅在 parent 进程中调用。 但是当 alarm(2) 被调用时,它会覆盖 parent 过程中的 sleep(10)。 Parent 打印前只等待 2 秒 :

"parent retval=8"

而 child 等待 10 秒。为什么 alarm() 信号会覆盖 sleep() 并睡眠 return 任何东西(显然在这种情况下它会这样做,但为什么?sleep() 不应该 return 任何东西,对吧?)?

代码如下。

<headers>

pid_t cpid;

int main() {
    int retval;
    signal(SIGALRM, handler);
    alarm(2);
    if ((cpid = fork()) == 0) {
        printf(“I’m the child\n”);
        retval = sleep(10);
        printf(“child retval=%d\n”, retval);
    }
    else {
        printf(“I’m the parent\n”);
        retval = sleep(10);
        printf(“parent retval=%d\n”, retval);
    }
}

/* Handle SIGALRM */
void handler(int sig)
{
    if (cpid == 0)
        printf(“running child handler\n”);
    else
        printf(“running parent handler\n”);
}

Sleep returns 0 或如果 returns 早点睡觉剩余的秒数。此外,手册页指出混合睡眠和警报不是一个好主意。

NAME
   sleep - Sleep for the specified number of seconds

SYNOPSIS
   #include <unistd.h>

   unsigned int sleep(unsigned int seconds);

DESCRIPTION
   sleep() makes the calling process sleep until seconds seconds have elapsed or a signal arrives which is not ignored.

RETURN VALUE
   Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal handler.

CONFORMING TO
   POSIX.1-2001.

BUGS
   sleep() may be implemented using SIGALRM; mixing calls to alarm(2) and sleep() is a bad idea.

   Using longjmp(3) from a signal handler or modifying the handling of SIGALRM while sleeping will cause undefined results.

SEE ALSO
   alarm(2), signal(2), signal(7)

Return 睡眠():

0 线程休眠了指定的全部时间。

value 由于信号的作用是 运行 一个 signal-catching 函数、结束请求或终止进程,线程没有完全休眠。返回值为指定休眠时间剩余的秒数;即seconds的值减去线程实际挂起的秒数。

-1 sleep() 没有成功。设置 errno 变量以指示错误。

创建子进程时,Alarm 不会在子进程中继承。