在学习signal()系统调用时,我应该遇到以下代码,
#include <stdio.h>
#include <signal.h>
void sigproc(int);
void quitproc(int);
int main(int argc,char **argv)
{
signal(SIGINT, sigproc); //Is it like a normal Call to signal()?
signal(SIGQUIT, quitproc);// This too?
printf("ctrl- c disabled use ctrl\ to quit \n");
while(1);
return 0;
}
void sigproc(int signo)
{
printf("you have pressed ctrl - c \n");
}
void quitproc(int signo)
{
printf("U cant quit\n");
// exit(0);
}
我在main()中调用函数signal()两次。但它只在我按下Ctrl-C和Ctrl- \键时执行。我认为它也像正常的函数调用。信号处理函数实际发生了什么?
答案 0 :(得分:4)
signal
函数建立了一个信号处理程序。意思是:“当我的进程收到此信号时,运行此函数而不是执行默认值”。
因此,在您的示例中,对signal
的调用不会调用函数。要实际看到有效的信号,请执行以下操作:
从另一个终端:
kill -INT `pidof proc`
作为旁注,printf
和朋友不是异步信号安全的。它可能会令人震惊,但在信号处理程序中使用它们是不安全的。
作为旁注,即使您标记了问题Unix
,重要的是要知道信号(和signal
函数)是C的标准组成部分。信号处理和{{ 1}}函数在§7.14.1中的C99中描述。