0

可能重复:
标准信号库中的 C 声明

这是对语法链接的参考。我只了解指向函数的指针的语法。但这太复杂了,请解释一下。

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

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

4

1 回答 1

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”类型定义的函数。

然后在系统级别,当我们的程序运行时,如果有信号进来并且我们已经对其进行了处理,我们就会这样做,如果我们没有适当的处理,操作系统会采取默认操作。

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

回答你的问题?

于 2012-09-24T18:07:25.083 回答