gpt4 book ai didi

c - 'wait' 系统调用上的 EINTR

转载 作者:太空狗 更新时间:2023-10-29 11:48:36 24 4
gpt4 key购买 nike

来自 man -e 2 wait :

The call wait(&status) is equivalent to: waitpid(-1, &status, 0);

错误号值:

EINTR WNOHANG was not set and an unblocked signal or a SIGCHLD was caught; see signal(7).

所以根据我对上面的理解,如果我们在“等待”中被阻塞并接收信号 (SIGCHLD),调用应该返回 -1 并且 errno 设置为 EINTR。虽然运行以下代码片段将证明等待实际上已重新启动(linux 4.15.0-43,glibc 2.23):

#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/wait.h>

static void sigchld_handler(int signo)
{
const char *const msg = "\nSIGCHLD";

(void)signo;
write(STDERR_FILENO, msg, strlen(msg));
}

int main(void)
{
pid_t wait_ret = 0, pid = 0;
int status = 0, ret = -1;

sigaction(SIGCHLD, &(struct sigaction){
.sa_handler = sigchld_handler,
}, NULL);

if ((pid = fork()) < 0)
{
perror("\nfork: ");
goto Exit;
}

if (!pid)
{
sleep(3);
return 0;
}

if ((wait_ret = wait(&status)) < 0)
{
perror("\nwait: ");
goto Exit;
}

fprintf(stderr, "\nwait done, pid %d", wait_ret);
ret = 0;

Exit:
fprintf(stderr, "\n");
return ret;
}

SA_RESTART 未设置 - 那么为什么“等待”重新启动。?实际输出:

SIGCHLD
wait done, pid 15242

我期望的输出:

SIGCHLD
wait: Interrupted system call

备注kill -CHLD <waiting process>手动从 shell 将给出预期的结果。

另请注意,在 FreeBSD 11.2 上运行代码也会产生预期的结果 - 等待因子退出错误而中断。

最佳答案

这里有一个微妙的解释。你必须开始:

on success, [wait] returns the process ID of the terminated child; on error, -1 is returned.

( Linux wait(2) manual page )

关于 errno 值的文档需要从这个角度来解释:wait() 返回 -1 的情况下 ,从而指示错误,并且errno设置为EINTR,解释为SIGCHLD或未阻塞的(其他)信号打断了等待。但这并不意味着 SIGCHLD 的接收一定会导致 wait() 失败。特别是,wait() 将正常完成,而不是在 SIGCHLD 由进程的一个子进程终止引起时引发错误。

在过于批评这里的文档之前,请考虑一下

  • SIGCHLD 可能会因为 child 终止以外的原因而被传送
  • 错误描述适用于该组中的所有函数,其中一些只能等待特定的 child 。这些可能会被他们不在等待的某个 child 的 SIGCHLD 打断。

文档的措辞似乎还表明,SIGCHLD 可能会导致其中一个或多个函数因 EINTR 而失败 ,即使该信号已被阻止。我会发现这种行为令人惊讶,但请记住我从哪里开始:该结果是对 EINTR 错误的可能解释之一并不一定意味着它可能实际发生。

关于c - 'wait' 系统调用上的 EINTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54200603/

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