2016-02-05 31 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變量被設置爲指示錯誤。

當孩子創建時,警報將不會繼承在子進程中。