【问题标题】:What is the difference between normal function call and signal() system call?普通函数调用和 signal() 系统调用有什么区别?
【发布时间】:2011-12-10 10:19:17
【问题描述】:

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

【问题讨论】:

    标签: c unix signals


    【解决方案1】:

    signal 函数建立一个信号处理程序。含义:“当我的进程收到这个信号时,运行这个函数而不是做任何默认的事情”。

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

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

      kill -INT `pidof proc`
      

    附带说明,printf 和朋友不是异步信号安全的。这可能会令人震惊,但在信号处理程序中使用它们是不安全的


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

    【讨论】:

      猜你喜欢
      • 2012-10-05
      • 1970-01-01
      • 2017-12-23
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      相关资源
      最近更新 更多