我正在试图弄清楚这段代码的作用,我可以使用一些帮助。
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
只是打印出错误的类型,并且它出现在哪一行,这与问题无关。
以下是我感到困惑的事情:
首先调用哪个函数sethandler
或sigchld_handler
?
(*f)(int)
是什么意思?
act.sa_handler = f
做了什么?。
答案 0 :(得分:3)
以下是我感到困惑的问题:首先调用哪个函数
sethandler
或sigchld_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_handler
是sigaction
中的en元素,设置为指向函数的指针。
至于首先调用哪一个,该信息不在您发布的代码中。
添加:sethandler
首先调用