gpt4 book ai didi

c - wait() 函数(在 LINUX 中)什么时候响应中断?

转载 作者:行者123 更新时间:2023-12-02 01:53:34 27 4
gpt4 key购买 nike

我有这样的C代码

int childid;
int parentid;
void siginthandler(int param)
{
// if this is the parent process
if(getpid() == parentid){
//handler code which sends SIGINT signal to child process
kill(childid, SIGINT);
}
else // if this is the child process
exit(0);
}

int main()
{
parentid = getpid(); // store parent id in variable parentid, for the parent as well as child process
int pid = fork();
int breakpid;
if(pid != 0){
childid = pid;
breakpid = wait();
printf("pid = %d\n", breakpid);
}
else
sleep(1000);
}

现在,当我运行这段代码时,父进程等待,而子进程休眠。如果我现在中断(通过按 ctrl+c)父程序,UNIX(POSIX 标准)文档告诉我等待函数应该返回 -1,errno 设置为EINTR。然而,我的代码实现终止了子进程,因为父进程向子进程发送了 SIGINT 信号。但是,令人惊讶的是,(在父进程中)wait 不会返回 pid = -1 且 errno 设置为 EINTR。相反,它返回被杀死的子进程的 ID。

这有解释吗?

最佳答案

当您使用 signal() 安装信号处理程序时,会发生以下两种情况之一

  1. 大多数系统调用在信号出现时被中断,并将 errno 设置为 EINTR。
  2. 大多数系统调用会在信号出现时自动重启(因此它们不会失败并将 errno 设置为 EINTR)。

这 2 个中的哪一个取决于您的平台,在您的平台上是 2(可能您没有显示任何安装信号处理程序的代码。)

如果您改为使用 sigaction 安装信号处理程序(),您可以使用 SA_RESTART 标志控制您想要的 12 的行为。

关于c - wait() 函数(在 LINUX 中)什么时候响应中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21466797/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com