我想生成一个进程并使用 stdin/out 与其进行通信。这一切都有效,但我注意到当孩子通过信号终止时,父母也会这样做。下面是一个例子。如果取消注释 true,程序将打印“完成”。如果您编译并取消注释 selfterm,则它不会,并且父进程将终止并退出代码 137。为什么父进程会终止以及如何阻止它?
主程序
#include <signal.h>
#include <sched.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int doexec(void*) {
//char*bin = "/usr/bin/true";
//char*bin = "/tmp/selfterm";
char*args[] = {bin, 0};
int err = execv(bin, args);
return err;
}
int main(int argc, char *argv[]) {
int pid = clone(doexec, malloc(2*1024*1024)+2*1024*1024, CLONE_VFORK|SIGCHLD, 0);
int status=0;
wait(&status);
puts("Finish");
}
Run Code Online (Sandbox Code Playgroud)
selfterm.c
#include<signal.h>
int main(int argc, char *argv[]) { kill(0, 9); }
Run Code Online (Sandbox Code Playgroud)
来自kill()手册:
如果 pid 等于 0,则将 sig 发送到调用进程的进程组中的每个进程。
kill(0, 9);终止组中的所有进程,包括父进程。
您可以使用raise()向调用者进程发送信号:
raise(SIGKILL);
Run Code Online (Sandbox Code Playgroud)
如果您想在与父进程分开的进程组中运行子进程,您可以使用以下命令使子进程成为新会话的领导者setsid():
raise(SIGKILL);
Run Code Online (Sandbox Code Playgroud)