[英]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 sethandler
或sigchld_handler
? (*f)(int)
是什么意思? 而act.sa_handler = f
做什么呢?
以下是我感到困惑的地方:哪个函数称为first
sethandler
或sigchld_handler
?
sethandler
是此代码中直接调用的唯一函数。 但是,在sethandler
对sigaction
的调用可能导致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_handler
是sigaction
中的en元素,设置为该函数的指针。
至于首先叫哪个,则该信息不在您发布的代码中。
加法: sethandler
首先被调用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.