【问题标题】:C declaration from standard signal Library来自标准信号库的 C 声明
【发布时间】:2021-12-12 03:55:08
【问题描述】:

那么有人可以解释一下这应该做什么:

void (*signal(int sig, void (*func)(int)) ) (int);

这是从标准信号库中获取的定义。

【问题讨论】:

    标签: c function


    【解决方案1】:

    函数signal 接受参数:

    int sig - a signal value
    void (*func)(int) - a pointer to a function that takes an int and returns void
    

    然后返回:

    void (*)(int) - a function that takes an int and returns void
    

    signal注册一个函数,当信号发生时调用,并返回前一个函数处理程序。

    【讨论】:

      【解决方案2】:

      手册页通过引入typedef 使这个声明更容易理解:

      typedef void (*sighandler_t)(int);
      
      sighandler_t signal(int signum, sighandler_t handler);
      

      sighandler_t 定义为指向接受int 并返回void 的函数的指针。

      signal 是一个接受int(信号编号)和函数指针并返回函数指针的函数。

      【讨论】:

        【解决方案3】:

        基本上,它允许决定如何处理发送到您的程序的特定信号(由参数int sig 标识)。

        void (*func)(int) 是指向将处理信号的函数的指针(您可以提供自定义函数或使用 SIG_DFL SIG_IGN 这是正常管理或忽略它的默认操作)。

        函数signal 然后返回指向在调用此函数之前存在的处理程序的指针,否则SIG_ERR 发生错误。这可用于在您最近完成自定义行为后恢复默认处理程序。

        【讨论】:

          【解决方案4】:

          以名字开头:

          signal
          

          尽可能向右走:

          signal(int sig, void (*func)(int))
          

          您有一个带括号的参数列表,因此它是一个带有 2 个参数的函数:一个名为 sigint 和一个名为 func 的函数指针(您可以稍后以相同的方式对其进行分析)。

          然后你又碰到了一个右括号,所以你向左走:

          *signal(int sig, void (*func)(int))
          

          所以函数signal 返回一个指向...某物的指针。让我们去掉括号,再往右走,因为我们可以:

          (*signal(int sig, void (*func)(int)) ) (int)
          

          我们又得到了一个带括号的参数列表,所以signal 返回一个指向函数的指针,该函数将int 作为唯一的参数。然后再向左走:

          void (*signal(int sig, void (*func)(int)) ) (int)
          

          因此,函数 signal 返回指向函数的指针,该函数采用 int 并返回 void

          是的,这种语言很奇怪,但至少它是一致的。 :)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多