在 linux 中创建子进程并处理可能失败的最佳方法
Best way to create child process in linux and handle possible failing
我有父进程,必须创建几个子进程。我发现的最佳方法是使用 fork
+ execl
。但是父进程需要知道具体子进程的 execl
是否失败,我不知道如何实现。
int pid = fork();
if (pid < 0) {
std::cout << "ERROR on fork." << std::endl;
} if (pid == 0) {
execl("/my/program/full/path", (char *)NULL);
exit(1);
}
else {
if (/*child's process execl fails*/) {
std::cout << "it failed" << std::endl
} else {
std::cout << "child born" << std::endl
}
}
我觉得这个想法不好:
int status(0);
sleep(100);
int res = waitpid(pid, &status, WNOHANG);
if (res < 0 && errno == 10) {
std::cout << "it failed" << std::endl
} else {
std::cout << "child born" << std::endl
}
因为希望子进程在 100 毫秒后死亡是不好的,所以我想确定这一点,因为只有那样才会发生。
我也认为创建 shared_memory 或用于此类检查的特殊管道连接是对蜜蜂的大炮。
必须有一个简单的解决方案,我只是还没有找到。
实现该目标的最佳方法是什么?
作为通用解决方案,您可以使用 sigaction() 在父级中注册信号处理程序 (SIGUSR1)。
在子进程中:取消注册信号处理程序,如果 execl() 调用失败,您需要将 SIGUSR1 发送给父进程。
在父级中:我们将存储在 std::set 中的每个子 pid。创建所有子项后,您只需创建一个单独的线程来跟踪子项。在线程函数中,只需调用 wait() 并从集合中删除 pid。监听 SIGCHLD 信号的另一种方法(但它会导致更复杂的解决方案,因此如果生成另一个线程是一个选项,我会使用线程)。
当集合为空时我们就完成了。
我有父进程,必须创建几个子进程。我发现的最佳方法是使用 fork
+ execl
。但是父进程需要知道具体子进程的 execl
是否失败,我不知道如何实现。
int pid = fork();
if (pid < 0) {
std::cout << "ERROR on fork." << std::endl;
} if (pid == 0) {
execl("/my/program/full/path", (char *)NULL);
exit(1);
}
else {
if (/*child's process execl fails*/) {
std::cout << "it failed" << std::endl
} else {
std::cout << "child born" << std::endl
}
}
我觉得这个想法不好:
int status(0);
sleep(100);
int res = waitpid(pid, &status, WNOHANG);
if (res < 0 && errno == 10) {
std::cout << "it failed" << std::endl
} else {
std::cout << "child born" << std::endl
}
因为希望子进程在 100 毫秒后死亡是不好的,所以我想确定这一点,因为只有那样才会发生。
我也认为创建 shared_memory 或用于此类检查的特殊管道连接是对蜜蜂的大炮。
必须有一个简单的解决方案,我只是还没有找到。
实现该目标的最佳方法是什么?
作为通用解决方案,您可以使用 sigaction() 在父级中注册信号处理程序 (SIGUSR1)。
在子进程中:取消注册信号处理程序,如果 execl() 调用失败,您需要将 SIGUSR1 发送给父进程。
在父级中:我们将存储在 std::set 中的每个子 pid。创建所有子项后,您只需创建一个单独的线程来跟踪子项。在线程函数中,只需调用 wait() 并从集合中删除 pid。监听 SIGCHLD 信号的另一种方法(但它会导致更复杂的解决方案,因此如果生成另一个线程是一个选项,我会使用线程)。
当集合为空时我们就完成了。