プロセスのすべての子孫プロセスを殺す方法(Linux C)
1858 ワード
プロセスを殺すサブプロセスはkill(ChildPid,SIGTERM)を利用すれば可能であるが,サブプロセスの息子をどのように殺すかは,ここではプロセスグループの概念を用い,kill関数は負のpidを伝達する方法を利用してSIGTERM信号を同じプロセスグループ番号を持つすべてのプロセスに伝達することができる.
以下はmanのkill関数の1つの説明です
テストプログラム:Redhatで実行し、psで子孫プロセスの作成と破棄を観察します.
以下はmanのkill関数の1つの説明です
#include <sys/types.h>
#include <signal.h>
/*
pid>0:signal sig is sent to pid
pid==0:sig is sent to every process in the process group of the current process
pid==-1: sig is sent to every process for which the calling process has permission to send signals, except for process 1 (init)
pid<-1:sig is sent to every process in the process group -pid
*/
int kill(pid_t pid, int sig);
テストプログラム:Redhatで実行し、psで子孫プロセスの作成と破棄を観察します.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int stat;
for (;;)
{
pid = fork();
if (pid == 0)
{
/* ID PID */
setpgrp();
printf("Child process running:pid=%d,pgid=%d
", getpid(),getpgrp());
printf("Creat grandchild process sleep 20 seconds
");
/* */
system("sleep 20");
exit(0);
}
else if (pid > 0)
{
printf("Parent process pid=%d, pgid=%d
", getpid(),getpgrp());
printf("Parent process sleep 10 seconds
");
sleep(10);
/* PID SIGTERM */
kill(-pid, SIGTERM);
wait(&stat);
printf("All child and grandchild processes with pgid=%d were killed
", pid);
}
else
printf("Fork fail : %s
", strerror(errno));
}
return 0;
}