【问题标题】:What does this code do ? C这段代码有什么作用? C
【发布时间】:2017-03-11 17:08:10
【问题描述】:

我正试图弄清楚这段代码的作用,我需要一些帮助。

int sethandler( void (*f)(int), int sigNo) {
    struct sigaction act;
    memset(&act, 0, sizeof(struct sigaction));
    act.sa_handler = f;
    if (-1==sigaction(sigNo, &act, NULL))
        return -1;
    return 0;
}

void sigchld_handler(int sig) {
    pid_t pid;
    for(;;)
    {
        pid=waitpid(0, NULL, WNOHANG);
        if(0==pid) return;
        if(0>=pid) {
            if(ECHILD==errno) return;
                ERR("waitpid:");
        }
    }
}

这是 main 中的函数调用:

if(sethandler(sigchld_handler, SIGCHLD)) 
    ERR("Setting parent SIGCHLD Error:");

ERR 只是打印出错误的类型,发生在哪一行,与问题无关。

以下是我感到困惑的: 哪个函数首先被调用sethandlersigchld_handler?。 (*f)(int)是什么意思? act.sa_handler = f做了什么?

【问题讨论】:

    标签: c signals


    【解决方案1】:

    以下是我感到困惑的地方:首先调用哪个函数sethandlersigchld_handler

    sethandler 是这段代码中唯一直接调用的函数。但是,在 sethandler 中调用 sigaction 可能会导致稍后调用 sigchld_handler

    (*f)(int) 是什么意思?

    void (*f)(int) 是一个名为f 的指针变量,指向一个函数,该函数接受一个int 参数并返回void。 (在这种情况下,指向的函数是sigchld_handler。)

    act.sa_handler = f 是做什么的?

    它将指针分配给act.sa_handler。这用于将该函数注册为信号处理程序。

    【讨论】:

    • sethander 函数的哪一行调用sigchld_handler 函数?
    • 没有。该函数未被调用;它被注册为信号处理程序。
    【解决方案2】:

    void (*f)(int) 是什么意思?

    语法是将f 声明为一个指向一个函数的指针,该函数采用一个int 参数并且不返回任何结果。出于可读性原因,我更喜欢在function's signature 上使用typedef

    您应该阅读一本关于编程的好书(例如,SICP 解释了将函数处理为 first-class 值的兴趣)和另一本关于 C 编程的好书。然后您将阅读 realize C 所做的 not拥有真正的closures,并且您需要使用关于callbacks约定

    act.sa_handler = f; 做了什么

    将函数指针f分配给结构act的成员sa_handler

    您需要仔细阅读信号。我建议先阅读Advanced Linux Programming,然后阅读仔细 signal(7)async-signal-safe-function 的概念很难理解且很重要)和sigaction(2)

    (因此需要几本书来回答您的问题。我提供了参考资料,但您需要花费数周时间阅读)

    【讨论】:

      【解决方案3】:

      你需要找到sigaction的声明。

      f 是一个指向函数 int -> void 的指针。

      sa_handlersigaction 中的元素,设置为指向函数的指针。

      至于先调用哪个,那信息不在你贴的代码中。

      加法:sethandler 先调用

      【讨论】:

        猜你喜欢
        • 2011-04-13
        • 2011-12-31
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多