[C/Unix]Utilisation du wait

Utilisation du wait [C/Unix] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 02-05-2013 à 16:37:55    

Bonjour, j'ai un petit soucis lors de l'éxécution du programme suivant :
 
Un processus lance en tâche de fond une recherche avec affichage des fichiers « *.txt » présents à partir du répertoire courant. Aussitôt et en parallèle, il travaille 5 secondes (simulé à l’aide de sleep). À l’issue de ce travail, il attend (éventuellement) la fin de la tâche qu’il a lancée (on ne connait pas le temps de l’exécution de cette tâche).
 
Enfin, il vérifie la « qualité » de l’exécution de la tâche en analysant puis en affichant le compte-rendu complet de son exécution. Un message final achève son travail.
 
Voici le code associé:  
 

Code :
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. int main(void)
  7. {
  8.     int n, ret;
  9.     n= fork();
  10.     if ( n == -1 )
  11.         {
  12.             fprintf(stderr,"Probleme execution fork\n" );
  13.             exit(1);
  14.         }
  15.     if ( n == 0 )
  16.         {
  17.             ret= execlp("find",".","-name","*.txt","-print",NULL);
  18.             exit(2);
  19.         }
  20.     else
  21.         {
  22.             sleep(5);
  23.             ret = wait(&n);
  24.             if ( WIFEXITED(n) )
  25.               printf("fils %d mort par exit %d\n",ret,WEXITSTATUS(n));
  26.             else
  27.               printf("fils %d mort par signal %d\n",ret,WTERMSIG(n));
  28.             printf("fin\n" );
  29.         }
  30.     exit(0);
  31. }


 
Seulement, lors de l'execution, voici ce qui est affiché :
 

Code :
  1. ./fichier1.txt
  2. ./sous dossier/fichier2.txt
  3. fils 11112 mort par exit 0
  4. fin


 
Le code de retour de l'exit est 0, alors qu'il devrait être 2.
Comment expliquer cela ?   :??:


Message édité par Astroya le 05-05-2013 à 17:46:28
Reply

Marsh Posté le 02-05-2013 à 16:37:55   

Reply

Marsh Posté le 05-05-2013 à 17:42:55    

Bonjour, tu as écrit en dur "exit(0)" pourquoi le code de retour serait 2 ?

Reply

Marsh Posté le 05-05-2013 à 17:45:48    


Comment ça ?
 

Code :
  1. if ( n == 0 )
  2.         {
  3.             ret= execlp("find",".","-name","core","-print",NULL);
  4.             exit(2);
  5.         }

Reply

Marsh Posté le 05-05-2013 à 17:55:28    

Selon le code de ton if tu ne pourait pas avoir à la fois la ligne d'info find et le message "mort du fils" donc il doit y avoir une confusion entre le code de retour de ton processus copier et le processus appellé. j'y connais rien en fork, d'ailleur pourquoi en faire un ?

Reply

Marsh Posté le 12-06-2013 à 22:32:27    

En regardant vite fait je dirais que ton execlp se termine normalement donc ret= exit(0) et ton exit(2); est pas exécuté.
Ajoute un printf entre les 2 pour voir.
Il faudrait regarder la doc de execlp().
edit: je me demande si c'est pas ton  ret = wait(&n); qui fout le bronx


Message édité par grao le 12-06-2013 à 23:03:26

---------------
Recherche affiche de GITS Arise 3 et 4, faire offre.
Reply

Marsh Posté le 12-06-2013 à 22:36:05    

Ouais j'ai fini par le voir, mais merci beaucoup pour la réponse ;)

Reply

Marsh Posté le 12-06-2013 à 23:05:47    

C'était quoi du coup ? :D


---------------
Recherche affiche de GITS Arise 3 et 4, faire offre.
Reply

Marsh Posté le 13-06-2013 à 00:46:01    

grao a écrit :

C'était quoi du coup ? :D


Recouvrement du processus par le exec qui exit avec un code 0 :jap:


Message édité par Astroya le 13-06-2013 à 00:46:10
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed