2013-01-01 29 views
3

我在我的主程序中執行fork,並在將運行另一個程序的子進程中執行exec。現在我想終止這個孩子(即由exec調用的程序)並返回到主程序(或父程序)。我怎麼能達到這個..我試着用ctrl + c但它的殺死父進程和孩子also.please幫助我。如何通過執行exec來終止正在運行另一個程序的子進程

/*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); 
} 

現在我想殺死「測試應用程序」(由exec調用),並返回到父進程或「else塊」來繼續該程序。

+0

看起來像這樣的問題: – aldrinleal

+0

你說「返回到主程序」,但如果你分叉,它大概還在運行? – ysth

回答

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的有效性。

+0

注意'fork'是否返回'-1'。 – kmkaplan

+0

@kmkaplan:將被修復,我正在編輯。 – md5

6

你需要做到以下幾點:

  1. 做一個kill(pid, SIGTERM)第一 - 這給子進程一個機會,終止正常
  2. 等待一段時間(使用sleep)。這段時間取決於子進程優雅地關閉的時間。
  3. 使用waitpid(pid, &status, WNOHANG)檢查返回值。如果該過程沒有中止做第4步
  4. 做一個kill(pid, SIGKILL)然後通過做waitpid(pid, &status, 0)收穫殭屍。

這些步驟可確保您爲子進程提供一個信號處理程序來關閉並確保您沒有殭屍進程。

相關問題