在父进程被终止时杀死子进程是一种常见的操作,以确保子进程不会在父进程结束后继续运行。这可以通过在父进程中使用信号处理程序来实现。
在Linux系统中,可以使用signal()
函数来设置信号处理程序。例如,可以使用以下代码来设置父进程在接收到SIGTERM
信号时杀死子进程:
#include<signal.h>
#include <unistd.h>
#include <sys/wait.h>
void sig_handler(int sig) {
pid_t pid;
while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
kill(pid, SIGTERM);
}
exit(0);
}
int main() {
signal(SIGTERM, sig_handler);
pid_t pid = fork();
if (pid == 0) {
// 子进程代码
} else {
// 父进程代码
}
return 0;
}
在这个例子中,当父进程接收到SIGTERM
信号时,信号处理程序sig_handler()
会被调用。在信号处理程序中,我们使用waitpid()
函数来获取所有子进程的ID,并使用kill()
函数向它们发送SIGTERM
信号,以便它们终止。
在Windows系统中,可以使用CreateProcess()
函数来创建子进程,并使用TerminateProcess()
函数来杀死子进程。例如,可以使用以下代码来创建子进程并在父进程被终止时杀死子进程:
#include<windows.h>
#include<process.h>
HANDLE hProcess;
void sig_handler(int sig) {
TerminateProcess(hProcess, 0);
exit(0);
}
int main() {
signal(SIGTERM, sig_handler);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
CreateProcess("child.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
hProcess = pi.hProcess;
// 父进程代码
return 0;
}
在这个例子中,我们使用CreateProcess()
函数创建子进程,并将子进程的句柄存储在全局变量hProcess
中。当父进程接收到SIGTERM
信号时,信号处理程序sig_handler()
会被调用。在信号处理程序中,我们使用TerminateProcess()
函数来杀死子进程。
总之,在父进程被终止时杀死子进程可以通过在父进程中使用信号处理程序来实现。在Linux系统中,可以使用signal()
函数和kill()
函数来设置信号处理程序和发送信号。在Windows系统中,可以使用CreateProcess()
函数和TerminateProcess()
函数来创建子进程和杀死子进程。
领取专属 10元无门槛券
手把手带您无忧上云