[C / Unix]

[C / Unix] - Programmation

Marsh Posté le 05-03-2002 à 14:33:40    

Bonjour a tous,
je développe une appli sous Unix qui doit piloter un ensemble de scripts CSchell. J'aimerais savoir comment faire pour récupérer dans l'exe la valeur de retour du script et comment mettre en attente l'exe jusqu'à la fin du script et lobtention de sa valeur de retour ?

Reply

Marsh Posté le 05-03-2002 à 14:33:40   

Reply

Marsh Posté le 05-03-2002 à 14:37:39    

man waitpid

Reply

Marsh Posté le 05-03-2002 à 14:45:21    

J'ai une réponse du man pour wait (pas très claire) et aucune sur waitpid. Plus d'infos ?

Reply

Marsh Posté le 05-03-2002 à 19:58:00    

Si tu veux, je recopie la page de man :

Code :
  1. NOM
  2.        wait, waitpid - Attendre la fin d'un processus.
  3. SYNOPSIS
  4.        #include <sys/types.h>
  5.        #include <sys/wait.h>
  6.        pid_t wait(int *status)
  7.        pid_t waitpid(pid_t pid, int *status, int options);
  8. DESCRIPTION
  9.        La  fonction wait suspend l'exécution du processus courant
  10.        jusqu'à ce qu'un enfant se termine, ou  jusqu'à  ce  qu'un
  11.        signal  à  intercepter arrive.  Si un processus fils s'est
  12.        déjà terminé au moment de l'appel  (il  est  devenu  "zom­
  13.        bie" ),  la  fonction  revient  immédiatement.   Toutes les
  14.        ressources utilisées par le fils sont libérées.
  15.        La  fonction  waitpid  suspend  l'exécution  du  processus
  16.        courant  jusqu'à  ce  que  le processus fils numéro pid se
  17.        termine, ou jusqu'à ce qu'un signal à intercepter  arrive.
  18.        Si  le fils mentionné par pid s'est déjà terminé au moment
  19.        de l'appel (il est devenu "zombie" ), la  fonction  revient
  20.        immédiatement.   Toutes  les  ressources  utilisées par le
  21.        fils sont libérées.
  22.        La valeur de pid peut également être l'une des suivantes :
  23.        < -1   attendre  la  fin  de n'importe quel processus fils
  24.               appartenant à un groupe de processus d'ID pid.
  25.        -1     attendre la fin de n'importe quel  fils.  C'est  le
  26.               même comportement que wait.
  27.        0      attendre la fin de n'importe quel processus fils du
  28.               même groupe que l'appelant.
  29.        > 0    attendre la fin du processus numéro pid.
  30.        La valeur de l'argument option options est un  OU  binaire
  31.        entre les constantes suivantes :
  32.        WNOHANG ne pas bloquer si aucun fils ne s'est terminé.
  33.        WUNTRACED
  34.                recevoir  l'information  concernant  également les
  35.                fils bloqués si on ne l'a pas encore reçue.
  36.        Si status  est  non  NULL,  wait  et  waitpid  y  stockent
  37.        l'information sur la terminaison du fils.
  38.        Cette information peut être analysée avec les macros suiv­
  39.        antes, qui réclament en argument le buffer status (un int,
  40.        et non pas un pointeur sur ce buffer).
  41.        WIFEXITED(status)
  42.                non nul si le fils s'est terminé normalement
  43.        WEXITSTATUS(status)
  44.                donne  le code de retour tel qu'il a été mentionné
  45.                dans l'appel exit() ou dans le return de  la  rou­
  46.                tine  main.   Cette macro ne peut être évaluée que
  47.                si WIFEXITED est non nul.
  48.        WIFSIGNALED(status)
  49.                indique que le fils s'est  terminé  à  cause  d'un
  50.                signal non intercepté.
  51.        WTERMSIG(status)
  52.                donne le nombre de signaux qui ont causé la fin du
  53.                fils. Cette macro ne  peut  être  évaluée  que  si
  54.                WIFSIGNALED est non nul.
  55.        WIFSTOPPED(status)
  56.                indique que le fils est actuellement arrêté. Cette
  57.                macro n'a de sens que si l'on a  effectué  l'appel
  58.                avec l'option WUNTRACED.
  59.        WSTOPSIG(status)
  60.                donne  le  nombre de signaux qui ont causé l'arrêt
  61.                du fils. Cette macro ne peut être évaluée  que  si
  62.                WIFSTOPPED est non nul.
  63.        Certaines versions d'Unix (Linux, Solaris, mais pas AIX ou
  64.        SunOS) définissent aussi une macro WCOREDUMP(status)  Pour
  65.        vérifier  si  le  processus  fils  a créé un fichier core.
  66.        N'utilisez  ceci  qu'encadré  par  #ifdef  WCOREDUMP   ...
  67.        #endif.
  68. VALEUR RENVOYÉE
  69.        En  cas  de réussite, le PID du fils qui s'est terminé est
  70.        renvoyé, en cas d'echec -1 est renvoyé et  errno  contient
  71.        le  code  d'erreur.   Si WNOHANG a été employé et qu'aucun
  72.        fils ne s'est terminé, zéro est renvoyé.
  73. ERREURS
  74.        ECHILD  Le processus indiqué  par  pid  n'existe  pas,  ou
  75.                n'est  pas  un  fils du processus appelant.  (Ceci
  76.                peut arriver pour son propre fils si  l'action  de
  77.                SIGCHLD  est  placé sur SIG_IGN, voir également le
  78.                passage  de  la  section  NOTES   concernant   les
  79.                threads).
  80.        EINVAL  L'argument options est invalide.
  81.        ERESTARTSYS
  82.                WNOHANG  n'est  pas indiqué, et un signal à inter­
  83.                cepter ou SIGCHLD a été  reçu.  Cette  erreur  est
  84.                renvoyée  par l'appel système.  La routine de bib­
  85.                liothèque d'interface n'est pas autorisée  à  ren­
  86.                voyer ERESTARTSYS, mais renverra EINTR.
  87. NOTES
  88.        Les  spécifications  Single  Unix  décrivent  un  attribut
  89.        SA_NOCLDWAIT (absent sous Linux) permettant (lorsqu'il est
  90.        positionné)  aux  processus  fils  se  terminant de ne pas
  91.        devenir zombies, comme quand  l'action  pour  SIGCHLD  est
  92.        fixée  à  SIG_IGN (ce qui toutefois n'est pas autorisé par
  93.        POSIX). Un appel à wait() ou waitpid() bloquera jusqu'à ce
  94.        qu'un  fils se termine, puis échouera avec errno contenant
  95.        ECHILD.
  96.        Dans le noyau Linux, un thread  ordonnancé  par  le  noyau
  97.        n'est  pas  différent  d'un  simple processus. En fait, un
  98.        thread est juste un processus qui est créé à l'aide de  la
  99.        routine - spécifique Linux - clone(2). Les routines porta­
  100.        bles,  comme  pthread_create(3)   sont   implémentées   en
  101.        appelant  clone(2).   Ainsi,  si  deux threads A et B sont
  102.        frères, alors le thread A ne peut pas se mettre en attente
  103.        sur  un processus créé par le thread B ou ses descendants,
  104.        car un oncle ne peut pas attendre un neveu.   Sur  d'autre
  105.        systèmes Unix, où de multiples threads sont implémentés au
  106.        sein d'un unique processus, le thread A peut naturellement
  107.        attendre  la  fin de n'importe quel processus lancé par un
  108.        thread frère B. Pour qu'un programme qui se  base  sur  ce
  109.        comportement  fonctionne sous Linux, il faudra en modifier
  110.        le code.
  111. CONFORMITÉ
  112.        SVr4, POSIX.1
  113. VOIR AUSSI
  114.        clone(2),  signal(2),  wait4(2),  pthread_create(3),  sig­
  115.        nal(7)
  116. TRADUCTION
  117.        Christophe Blaess, 1997.

Reply

Marsh Posté le 06-03-2002 à 08:51:58    

Merci pour l'info et pour l'aide

Reply

Sujets relatifs:

Leave a Replay

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