普通函数调用和signal()系统调用有什么区别?

时间:2011-12-10 10:19:17

标签: c unix signals

在学习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- \键时执行。我认为它也像正常的函数调用。信号处理函数实际发生了什么?

1 个答案:

答案 0 :(得分:4)

signal函数建立了一个信号处理程序。意思是:“当我的进程收到此信号时,运行此函数而不是执行默认值”。

因此,在您的示例中,对signal 的调用不会调用函数。要实际看到有效的信号,请执行以下操作:

  • 在一个终端中启动您的流程
  • 从另一个终端:

    kill -INT `pidof proc`
    

作为旁注,printf和朋友不是异步信号安全的。它可能会令人震惊,但在信号处理程序中使用它们是不安全的


作为旁注,即使您标记了问题Unix,重要的是要知道信号(和signal函数)是C的标准组成部分。信号处理和{{ 1}}函数在§7.14.1中的C99中描述。