有人可以解释一下C中signal()语法的含义吗?

时间:2012-09-24 17:35:45

标签: c syntax process

  

可能重复:
  C declaration from standard signal Library

以下是对语法链接的引用。我只理解指向函数的指针的语法。但这太复杂请解释。

http://www.cplusplus.com/reference/clibrary/csignal/signal/

我试图理解给定的精确语法(一些我无法解决的指针混淆)。

1 个答案:

答案 0 :(得分:4)

signal()很容易理解这里的示例代码来自我在注释中提到的链接:

//This is a signal handling function. When your main program gets a signal, it
// will call this function. The function just prints a message.
static void catch_function(int signal) {
    printf("Interactive attention signal caught.");
}

int main(void) {
    //register to catch the interrupt signal.
    if (signal(SIGINT, catch_function) == SIG_ERR) {
        printf("An error occurred while setting a signal handler.\n");
        return EXIT_FAILURE;
    }
    while(1)
    {
      printf("do stuff\n");
      sleep(1);
    }
}

现在这段代码将永远循环(做某事),直到它得到^ C(ctrl + C)中断信号。在那个时间点,我们会告诉它做任何事情:

mike@linux-4puc:~> ./a.out 
do stuff
do stuff
^CInteractive attention signal caught.do stuff
do stuff
do stuff
do stuff
do stuff
^CInteractive attention signal caught.do stuff

信号功能定义为:

typedef void (*sighandler_t)(int); //this just means a pointer to a function
                                   //that looks like:  void sighandler(int)

sighandler_t signal(int signum, sighandler_t handler); 

这意味着:

  1. 指向处理信号的函数的指针可以称为“sighandler_t”
  2. 满足sighandler_t类型的函数需要不返回任何内容,并采用int
  3. 信号函数接着捕获信号类型的参数,以及符合“sighandler_t”typedef的函数。
  4. 然后在系统级别,当我们的程序运行时,如果有信号进来并且我们已经处理它,我们这样做,如果我们没有处理,操作系统会采取默认操作。

    如果你从上面的例子中删除了信号调用,你会看到ctrl + C现在杀死程序而不是只允许信号处理程序运行。

    回答你的问题?