signal()函数与sigaction()函数对比

2019-02-16  本文已影响0人  一只肥豚鼠

使用linux,就得使用man page,那么来吧

signal()

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

举个栗子:

#include <signal.h>
int main(int argc, char const *argv[])
{
    signal(SIGINT, SIG_IGN);
    while(1);
    return 0;
}

解释一下:

放一下运行结果

image

注意事项

image
从上方的man page中可以看到,man page让我们避免使用signal()函数,而去使用sigaction()函数,原因如下:
int sig_int(); //My signal handler
    ...
    signal(SIGINT, sig_int);
    ...
int sig_int()
{
    signal(SIGINT, sig_int);
    ....
}

这种代码段的一个问题是:在信号发生之后到信号处理程序中调用s i g n a l函数之间有一个时间窗口。在此段时间中,可能发生另一次中断信号。第二个信号会造成执行默认动作,而对中断信号则是终止该进程。这种类型的程序段在大多数情况下会正常工作,使得我们认为它们正确,而实际上却并不是如此。
另一个问题是:在进程不希望某种信号发生时,它不能关闭该信号。

上一篇 下一篇

猜你喜欢

热点阅读