这段代码有什么作用? C

时间:2017-03-11 08:43:14

标签: c signals

我正在试图弄清楚这段代码的作用,我可以使用一些帮助。

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做了什么?。

3 个答案:

答案 0 :(得分:3)

  

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

sethandler是此代码中直接调用的唯一函数。然而,sigaction中对sethandler的调用可能导致稍后调用sigchld_handler

  

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

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

  

act.sa_handler = f做了什么?

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

答案 1 :(得分:2)

  

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

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

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

  

act.sa_handler = f;做什么

它为结构sa_handler的成员act分配函数指针f

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

(所以需要几本书才能回答你的问题。我提供了参考文献,但你需要花费数周的时间来阅读它们)

答案 2 :(得分:1)

您需要找到sigaction的声明。

f是指向函数int的指针 - >空隙。

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

至于首先调用哪一个,该信息不在您发布的代码中。

添加:sethandler首先调用