signal和sleep函數混用的問題



#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void proc_signal(int signal)
{
    if (SIGINT == signal) {
        printf("got a signal(%d) is SIGINT\n", signal);
        exit(1);
    } else if (SIGALRM == signal) {
        printf("got a signal(%d) is SIGALRM\n", signal);
    } else {
        printf("got a signal(%d) is not SIGINT and SIGALRM\n", signal);
    }
}

int main(int argc, char** argv)
{
    printf("main start\n");
    if (SIG_ERR == signal(SIGALRM, proc_signal)) {
        printf("An error occurred while setting a SIGALRM handler.\n");
        return 0;
    }
    if (SIG_ERR == signal(SIGINT, proc_signal)) {
        printf("An error occurred while setting a SIGINT handler.\n");
        return 0;
    }
    printf("set alarm 3\n");
    alarm(3);
    printf("main wait 180 sec\n");
    sleep(180);
    printf("main end\n");
    return 0;
}

在Ubuntu 14.04測試會發現,alarm發出信號後,就讓main程式執行停止程序


在sleep的manual中有提到

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

所以manual也不建議混用signal和sleep函數。

留言