我正在我的主程序中执行fork,并在子进程中执行exec,这将运行另一个程序。现在我想终止子进程(即exec调用的程序)并返回主程序(或父程序)。我怎么能实现这一点..我尝试使用ctrl + c,但它的杀死父进程和孩子也请帮助我。
/*This is main.c*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>
void sig_int(void);
void sig_term(void);
pid_t pid,ppid;
int main(char argc,char **argv){
int n;
char ch;
printf("***********Application to start or stop services**********\n");
do
{
printf("Enter 1 to start service no.1\n");
printf("Enter 2 to start service no.2\n");
printf("Enter 3 to start service no.3\n");
scanf("%d",&n);
if(fork() == 0)
{
switch(n)
{
case 1: printf("starting service no. 1..\n");
printf("checking whether the given service is already running...\n");
// system("./det.sh ./test")
pid = getpid();
printf("child process pid = %d\n",pid);
// signal(SIGINT,(void *)sig_int);
// signal(SIGTERM,(void *)sig_term);
//execl("/var/vR_main","vR_main",argv[1],argv[2],argv[3],argv[4],NULL);
execl("./test","test",0,0);//will run test.c
break;
case 2: printf("starting service no. 2..\n");
break;
case 3: printf("starting service no. 3..\n");
break;
}
}
else
{
int status;
wait(&status);
if (WIFEXITED(status))
printf("CHILD exited with %d\n", WEXITSTATUS(status));
if (WIFSIGNALED(status))
printf("signaled by %d\n", WTERMSIG(status));
if (WIFSTOPPED(status))
printf("stopped by %d\n", WSTOPSIG(status));
// sleep(2);
ppid = getpid();
printf("%d\n",ppid);
// wait();
printf("\nDo you want to continue...y/n:");
scanf(" %c",&ch);
}
}while(ch == 'y');
return 0;
}
void sig_int(void)
{
printf("caught signal\n");
kill(pid,SIGKILL);
// signal(SIGINT,SIG_DFL);
// exit(0);
}
void sig_term(void)
{
printf("killing the process\n");
signal(SIGINT,SIG_DFL);
// exit(0);
}
/*This is test.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
void sig_int(void);
void sig_term(void);
pid_t pid;
int main()
{
// int a=10,b=40,c=50,max;
pid = getpid();
printf("exec pid = %d\n",pid);
while (1)
{
signal(SIGINT,(void *)sig_int);
signal(SIGTERM,(void *)sig_term);
}
// max=a>b?a>c?a:c:b>c?b:c;
// printf("%d\n",max);
}
void sig_int(void)
{
printf("caught signal\n");
// signal(SIGINT,SIG_DFL);
kill(pid,SIGKILL);
// exit(0);
}
void sig_term(void)
{
printf("killing the process\n");
signal(SIGINT,SIG_DFL);
// exit(0);
}
现在我要杀死“test application”(由exec调用),然后返回父进程或“else block”继续该程序。
答案 0 :(得分:7)
您需要执行以下操作:
kill(pid, SIGTERM
) - 这会让子进程有机会优雅地终止sleep
)。这段时间取决于子进程正常关闭所需的时间。waitpid(pid, &status, WNOHANG)
检查返回值。如果该过程没有中止,请执行第4步kill(pid, SIGKILL
)然后通过waitpid(pid, &status, 0)
收集僵尸。这些步骤可确保您为子进程提供关闭信号处理程序,并确保您没有僵尸进程。
答案 1 :(得分:1)
在程序内外,可以使用kill
。通过包含<signal.h>
,您可以使用给定的PID终止进程(使用fork
返回值来执行此操作)。
#include <signal.h>
int pid;
switch (pid = fork())
{
case -1:
/* some stuff */
break;
case 0:
/* some stuff */
break;
default:
/* some stuff */
kill(pid, SIGTERM);
}
也可以在shell中使用kill
命令。要查找子进程的PID,可以运行ps
命令。
男子杀人
kill()
函数应向pid指定的进程或进程组发送信号。要发送的信号由sig指定,并且是<signal.h>
中给出的列表中的一个或0.如果sig为0(空信号),则执行错误检查但实际上没有发送信号。空信号可用于检查pid的有效性。
答案 2 :(得分:0)
POSIX为此定义kill(2)系统调用:
kill(pid, SIGKILL);