繁体   English   中英

该代码有什么作用? C

[英]What does this code do ? C

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

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只是打印出错误的类型,并且错误发生在哪一行,与问题无关。

以下是我的困惑:哪个函数称为first sethandlersigchld_handler (*f)(int)是什么意思? act.sa_handler = f做什么呢?

以下是我感到困惑的地方:哪个函数称为first sethandlersigchld_handler

sethandler是此代码中直接调用的唯一函数。 但是,在sethandlersigaction的调用可能导致sigchld_handler稍后被调用。

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

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

act.sa_handler = f做什么呢?

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

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

这是将f声明为具有一个int参数且不返回任何结果的函数的指针的语法。 出于可读性原因,我更喜欢在函数的签名上使用typedef

你应该阅读有关编程的一本好书(如SICP解释为处理功能利益一流值)和关于C.编程另一本好书,然后你会意识到是c也不能有真正的关闭 ,以及您需要使用有关回调的 约定

act.sa_handler = f;

其分配给构件sa_handler结构的act函数指针f

您需要仔细阅读有关信号的信息。 我建议先阅读高级Linux编程,然后仔细阅读signal(7)异步信号安全功能的概念很棘手,并且很重要,要理解)和sigaction(2)

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

您需要找到sigaction的声明。

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

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

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

加法: sethandler首先被调用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM