2016-05-14 8 views
0

Ich versuche, ein Programm für einen grundlegenden Prozesssteuerungsblock zu schreiben, der folgende Code zeigt, was ich in der Testphase getan habe, möchte ich wissen, ob wir ein Kind wieder töten können, anstatt ein neues Kind wieder zu forschen, wenn ja wie machen wir das. Vielen Dank im Voraus!
Code:
`ob ein getöteter Kindprozess fortgesetzt werden kann?

#include<sys/types.h> 
    #include<sys/wait.h> 
    #include<unistd.h> 
    #include<time.h> 
    #include<stdio.h> 
    #include<unistd.h> 
    #include<time.h> 
    #include<stdio.h> 
    #include<stdlib.h> 
int hell() 
    { 
    int j; 
    for(j=1;j<6;j++) 
    printf("%d hello\n",j);` 
    } 
int hello(k) 
    {  
int i 
for(i=1;i<15;i++ 
printf("%5d hello \n", i); 

    } 
void sigint() 
    { 
    signal(SIGCONT,sigint); /* reset signal */ 
    printf("CHILD: I have received a SIGINT\n"); 
    } 
int main() 
    { 
int i, status; 
pid_t childID, endID,end1id,parentid; 
time_t when; 

label: if ((childID = fork()) == -1) { 
    perror("fork error"); 
    exit(EXIT_FAILURE); 
} 
else if (childID == 0) { 
    time(&when);hell(); 
    printf("k value %d\n",hello(5)); 
    printf("Child process started at %s\n", ctime(&when)); 
    printf("child PID : %d \n",getpid()); 

    hello(); 
    sleep(10); 
    //kill(childID, SIGKILL);     

    exit(EXIT_SUCCESS); 
} 
} 
else { 
    time(&when); 
    printf("Parent process started at %s", ctime(&when)); 
    printf("parent PID : %d\n",getpid()); 
      hell(); 
     parentid = getpid(); 
for(i = 0; i < 15; i++) { 
     endID =waitpid(childID,&status,WNOHANG|WUNTRACED);  
    printf("endid: %d\n",endID); 
     end1id = waitpid(parentid, &status, WNOHANG|WUNTRACED);  
     if (endID == -1) { 
      perror("waitpid error"); 
      exit(EXIT_FAILURE); 
     } 
     else if (endID == 0) { 
      time(&when); 
      printf("Parent waiting for child at %s", ctime(&when)); 
      sleep(1); 
     } 
     else if (endID == childID) { 

      if (WIFEXITED(status)) 
      printf("Child ended normally\n\n"); 
      else if (WIFSIGNALED(status)){ 
     printf("Child ended because of an uncaught signal\n");goto label;} 
      else if (WIFSTOPPED(status)){ 
      printf("Child process has stopped\n");goto label;} 
      exit(EXIT_SUCCESS); 
     } 
} 
} 
+1

Was? Whay nennen es "getötet", wenn es weiterleben kann? –

+0

Erste Regel der Erziehung: Töte deine Kinder nicht, bis du absolut sicher bist, dass du nicht davon leben willst. –

Antwort

3

Wenn Sie den Befehl kill, um das Kind erteilen Sie es mit SIGSTOP, ohne aussetzen kann es dann wieder sterben, wo es SIGCONT mit links ab.

#include <stdio.h> 
#include <unistd.h> 
#include <signal.h> 

int main() { 
    pid_t childId; 

    if ((childId = fork()) == -1) { 
     printf("child fork failed\n"); 

    } else if (childId == 0) { 
     int i = 0; 
     while (1) { 
     printf("infinite child loop ==> %d\n", ++i); 
     sleep(1); 
     } 

    } else { 
     printf("parent: child started OK\n"); 
     sleep(5); 
     printf("parent: stopping child - but letting it live\n"); 
     kill(childId, SIGSTOP); 
     sleep(5); 
     printf("parent: resuming child since it stopped but never really died\n"); 
     kill(childId, SIGCONT); 
     printf("parent: child should be running again where it left off\n"); 
     sleep(5); 

    } 
} 

Ausgang:

parent: child started OK 
infinite child loop ==> 1 
infinite child loop ==> 2 
infinite child loop ==> 3 
infinite child loop ==> 4 
infinite child loop ==> 5 
infinite child loop ==> 6 
parent: stopping child - but letting it live 
parent: resuming child since it stopped but never really died 
parent: child should be running again where it left off 
infinite child loop ==> 7 
infinite child loop ==> 8 
infinite child loop ==> 9 
infinite child loop ==> 10 
infinite child loop ==> 11 
infinite child loop ==> 12 
+0

danke ich habe verstanden, was Sie versuchen zu vermitteln, aber das hat einen weiteren Zweifel gebracht .... Was ist, wenn das Kind abrupt als in einem Interrupt getötet wurde? Zum Beispiel: Ich führe diesen Code von einem Terminal und von einem anderen aus Ich töte den Prozess mit dem Kill cmd mit dem Kind pid ..? Ich hoffe, Sie bekommen meinen Punkt .. –

+0

Der Befehl kill ist schlecht benannt. Es sendet Signale und der Empfang des Signals kann dazu führen, dass der Prozess beendet wird. Es hängt davon ab, welches Signal es ist. Ihr Prozess kann auch einige Signale verarbeiten, aber keine anderen wie SIGSTOP. –