2016-02-05 57 views
0

我为alarm()创建了一个signal handler。父母派出另一个没有待处理的警报信号的过程。所以,警报只在父进程中调用。 但是当alarm(2)被调用时,它会覆盖父进程中的sleep(10)。家长只在打印前等待2秒钟:C中的alarm(int)可以覆盖sleep(int)吗?

"parent retval=8" 

而孩子等待10秒。为什么alarm()信号覆盖sleep(),并确实返回任何东西(显然它在这种情况下,但为什么?sleep()不应该返回任何东西,对吧?)?

代码如下。

<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”); 
} 

回答

1

如果返回提前,睡眠返回0或剩余秒数。另外,手册页指出混合睡眠和闹钟是一个坏主意。睡眠

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) 
+0

谢谢!我对于闹钟对睡眠有什么影响感到困惑,但它现在清晰了! – Krishh

0

返回():

0线程睡了指定的全职工作。

值由于信号的作用是运行信号捕获功能,结束请求或终止进程,线程没有全部休眠。返回的值是在指定的睡眠时间内剩余的秒数;也就是秒的值减去线程被挂起的实际秒数。

-1 sleep()不成功。 errno变量被设置为指示错误。

当孩子创建时,警报将不会继承在子进程中。

相关问题