2009-04-21 4 views
0

Je ne comprends pas pourquoi mon code ne fonctionne pas.Que dois-je faire pour modifier ma fourche() en C pour bien fonctionner?

Ceci est mon code. Je ne sais pas pourquoi j'ai un segment d'erreur. Quelqu'un pourrait-il m'expliquer la raison?

#include <iostream> 
#include <string> 
#include <sys/types.h> 
#include <unistd.h> 

int id_process; 

void manager_signal() { 
    kill (id_process, SIGKILL); 
    kill (getppid(),SIGKILL); 
} 

int main() { 
    id_process = fork(); 
    if (id_process==-1) { 
     perror("ERROR to create the fork"); 
    } else { 
     if (id_process != 0) { 
      printf("Father´s ID is %d \n", getpid()); 
      alarm(5); 
      (void) signal (SIGALRM, manager_signal); 
      sleep (20); 
      printf ("Running to where the father can be\n"); 
      alarm (0);   
     } else { 
      printf ("CHildren´s ID is %d \n", getpid()); 
      for (;;) { 
       printf ("Children RUN FOREVER ^^"); 
       sleep (2); 
      } 
     } 
    } 
    return 0; 
} 
+0

est ce devoir? – ojblass

+1

Pourrait être devoirs. Ou ce pourrait être quelqu'un qui commence à apprendre C/UNIX. Je vais laisser à l'essaim de décider mais je leur donnerai le bénéfice du doute. – paxdiablo

+1

Cette question ne doit pas être étiquetée "traitement du signal". C'est une erreur compréhensible, mais quelqu'un avec une réputation plus élevée que moi devrait ré-étiqueter cette question. –

Répondre

2

Votre question est un peu difficile à comprendre, puisque vous n'expliquez pas vraiment ce que l'erreur est, mais j'ai une question que je suis sûr, sera pertinente.

Pourquoi le processus "père" tue-t-il son enfant et son parent? Ne devrait-il pas tuer son enfant et lui-même (id_process et getpid() plutôt que getppid() qui est le parent PID)?

Cela semble être le problème. Quand je cours ça sous Cygwin, ça tue ma coquille (reproche-moi). Si je change à kill (getpid(),SIGKILL);, il se termine bien au bout de cinq secondes avec la sortie suivante:

$ vi qq.cpp ; g++ -o qq qq.cpp ; ./qq.exe 
Fathers ID is 6016 
Childrens ID is 4512 
Children RUN FOREVER ^^ 
Children RUN FOREVER ^^ 
Children RUN FOREVER ^^ 
Children RUN FOREVER ^^ 
Children RUN FOREVER ^^ 
Killed 

Ceci est le programme modifié comme suit:

#include <iostream> 
#include <string> 
#include <sys/types.h> 
#include <unistd.h> 

int id_process; 

void manager_signal (int x) { 
    kill (id_process, SIGKILL); 
    kill (getpid(),SIGKILL); 
} 

int main() { 
    id_process = fork(); 
    if (id_process==-1) { 
     perror("ERROR to create the fork"); 
    } else { 
     if (id_process != 0) { 
      printf("Fathers ID is %d\n", getpid()); 
      alarm(5); 
      (void) signal (SIGALRM, manager_signal); 
      sleep (20); 
      printf ("Running to where the father can be\n"); 
      alarm (0); 
     } else { 
      printf ("Childrens ID is %d\n", getpid()); 
      for (;;) { 
       printf ("Children RUN FOREVER ^^\n"); 
       sleep (1); 
      } 
     } 
    } 
    return 0; 
} 
+0

Exécutez le programme défectueux comme: sh -c "./testprog"; alors votre shell principal n'est pas tué. Bon repérage sur la définition incorrecte de manager_signal(); pouvez-vous toujours faire: void manager_signal (int) pour indiquer que la fonction prend un int (le numéro du signal) mais l'ignore? C'était une belle fonctionnalité en C++, je m'en souviens, que C ferait bien d'adopter aussi. –

0

Je ne pense pas

kill (id_process, SIGKILL); 

est requis non plus. Vous tuez le même processus dans l'instruction suivante.

Questions connexes