Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个代码是做什么的?C_C_Signals - Fatal编程技术网

这个代码是做什么的?C

这个代码是做什么的?C,c,signals,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; }

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

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\u handler
?。
(*f)(int)
是什么意思?。
act.sa_handler=f
做什么?

您需要找到
sigaction
的声明

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

sa_handler
sigaction
中的en元素,设置为指向函数的指针

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


添加:
sethandler
首先调用您需要找到
sigaction
的声明

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

sa_handler
sigaction
中的en元素,设置为指向函数的指针

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

添加:
sethandler
先调用

下面是我所困惑的:哪个函数首先被调用
sethandler
还是
sigchld\u handler

sethandler
是此代码中唯一直接调用的函数。但是,在
sethandler
中调用
sigaction
可能会导致以后调用
sigchld\u handler

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

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

那么,
act.sa_handler=f
做什么呢

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

下面是我所困惑的:哪个函数首先被调用
sethandler
还是
sigchld\u handler

sethandler
是此代码中唯一直接调用的函数。但是,在
sethandler
中调用
sigaction
可能会导致以后调用
sigchld\u handler

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

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

那么,
act.sa_handler=f
做什么呢

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

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

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

你应该读一本关于编程的好书(例如,解释将函数作为值处理的兴趣)和另一本关于用C编程的好书。然后你会发现C确实有正版的,并且你需要使用约定

什么是act.sa_handler=f执行

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

你需要仔细阅读信号。我建议先阅读,然后仔细阅读(异步信号安全函数的概念很难理解,很重要),然后

(所以需要几本书来回答你的问题。我提供了参考资料,但你需要花几个星期的时间来阅读)

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

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

你应该读一本关于编程的好书(例如,解释将函数作为值处理的兴趣)和另一本关于用C编程的好书。然后你会发现C确实有正版的,并且你需要使用约定

什么是act.sa_handler=f执行

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

你需要仔细阅读信号。我建议先阅读,然后仔细阅读(异步信号安全函数的概念很难理解,很重要),然后


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

sethander
函数的哪一行调用
sigchld\u handler
函数?没有一本。函数未被调用;它正在注册为信号处理程序。在
sethander
函数的哪一行调用
sigchld\u处理程序
函数?它们都没有。函数未被调用;它正在注册为信号处理程序。