C ng已交付,在这种情况下,waitpid将(正确地)显示为已正常终止。当然,它也可以由于接收到来自另一个源的信号或由于另一个原因而终止,例如,SIGSEGV

C ng已交付,在这种情况下,waitpid将(正确地)显示为已正常终止。当然,它也可以由于接收到来自另一个源的信号或由于另一个原因而终止,例如,SIGSEGV,c,C,以下是这种方法的要点。您需要添加详细信息以使其适合您,并添加错误处理以使其健壮: pid_t child_pid; int term_pipe[2]; pipe(term_pipe); child_pid = fork(); switch (child_pid) { case -1: // handle error break; case 0: // child // ... whatever ...

以下是这种方法的要点。您需要添加详细信息以使其适合您,并添加错误处理以使其健壮:

pid_t child_pid;
int term_pipe[2];

pipe(term_pipe);
child_pid = fork();

switch (child_pid) {
    case -1:
        // handle error
        break;
    case 0:
        // child
        // ... whatever ...
        exit(0);
}
close(term_pipe[1]);  // essential

fd_set read_fds;
struct timeval timeout = { /* timeout */ };
int result;

FD_ZERO(read_fds);
FD_SET(term_pipe[0], read_fds);
result = select(term_pipe[0] + 1, &read_fds, NULL, NULL, &timeout);

if (result == 0) {
    // timeout
    kill(child_pid, SIGTERM);
} else if (result < 0) {
    // handle error
    // in particular, you may need to resume waiting if the error is EINTR
} else {
    // the child terminated within the timeout
    assert(result == 1);
}

// don't forget to close the read end of the pipe
close(term_pipe[0]);

int status;
pid_t collected_pid = waitpid(child_pid, &status, 0);

if (collected_pid < 0) {
    // handle error
} else {
    assert(collected_pid == child_pid);
    // ... test the status to see how the child terminated ...
    // ...
}
pid\u t child\u pid;
国际术语_管道[2];
管道(术语“管道”);
child_pid=fork();
开关(子pid){
案例1:
//处理错误
打破
案例0:
//孩子
//……不管怎样。。。
出口(0);
}
关闭(术语_管道[1]);//本质的
fd_设置读取_fds;
结构timeval timeout={/*timeout*/};
int结果;
FD_零(读取fds);
FD_集(术语_管道[0],读取_fds);
结果=选择(术语管道[0]+1,&read\u fds,NULL,NULL,&timeout);
如果(结果==0){
//超时
杀戮(child_pid,SIGTERM);
}否则如果(结果<0){
//处理错误
//特别是,如果错误为EINTR,则可能需要恢复等待
}否则{
//子进程在超时时间内终止
断言(结果==1);
}
//不要忘记关闭管道的读取端
关闭(术语_管道[0]);
智力状态;
pid_t collected_pid=waitpid(子pid和状态,0);
如果(收集的\u pid<0){
//处理错误
}否则{
断言(收集的\u pid==子\u pid);
//…测试状态以查看子项是如何终止的。。。
// ...
}

请注意,您希望使用此功能正常处理子终止,因此不要像您的代码当前所做的那样阻止
SIGCHLD

请更好地描述此问题,而不是“不工作”。准确的预期行为和实际行为是什么?例如,您描述的问题是多个子进程,但显示的代码从不创建多个子进程。“此代码在线程池中运行”。你需要表现出一种自信。谁说线程代码没有问题?因此,我们需要看到能够重现问题的确切代码。如果您有多个线程试图使用这种方法同时等待子线程,那么遇到问题我并不感到惊讶。然后,您不能假设某个特定子进程的
SIGCHLD
将由试图等待该子进程的线程处理。@JohnBollinger在多个线程中等待子进程的更好方法是什么?。。。儿童跑步时间限制强制执行?这很棘手。您肯定需要共享数据跟踪哪个线程正在等待哪个子线程,以及在杀死该子线程之前它愿意等待多长时间。然后,我将考虑使用一个单独的线程,专门代表所有其他线程处理子进程管理职责。这将是复杂的,但我认为这还不如没有一个专门的线程来解决这个问题。请更好地描述这个问题,而不是“不起作用”。准确的预期行为和实际行为是什么?例如,您描述的问题是多个子进程,但显示的代码从不创建多个子进程。“此代码在线程池中运行”。你需要表现出一种自信。谁说线程代码没有问题?因此,我们需要看到能够重现问题的确切代码。如果您有多个线程试图使用这种方法同时等待子线程,那么遇到问题我并不感到惊讶。然后,您不能假设某个特定子进程的
SIGCHLD
将由试图等待该子进程的线程处理。@JohnBollinger在多个线程中等待子进程的更好方法是什么?。。。儿童跑步时间限制强制执行?这很棘手。您肯定需要共享数据跟踪哪个线程正在等待哪个子线程,以及在杀死该子线程之前它愿意等待多长时间。然后,我将考虑使用一个单独的线程,专门代表所有其他线程处理子进程管理职责。这将是复杂的,但我认为没有一个专门的线程来做这件事还不够。啊,奇怪。我本以为你至少可以就你自己的问题的答案投票。啊,奇怪。我本以为你至少可以就你自己问题的答案投票。