Forum Programmation.c Problème avec la fonction system et esd

Posté par  .
Étiquettes : aucune
0
12
oct.
2004
Bonjour,

J'utilise la fonction system dans mon code c pour effectuer des appels à mon serveur audio et pour jouer des sons en fonction d'événements particuliers ( par exemple pour le lancer le demon audio system(esd /dev/dsp) )
Aléatoirement j'ai le messge suivant en sortie de la fonction system : No child process.

J'utilise la REDHAT WS3

N'ayant plus d'idée pour avancer, je suis à l'écoute de toutes vos suggestions

Cordialement,
  • # meuh

    Posté par  (site web personnel) . Évalué à 3.

    system(3) est implémenté avec un fork(2), un execve(2) et un waitpid(2). Je pense que c'est le waitpid qui se prend le ECHILD. Voici ce que dit le man à ce propos :

    ECHILD if the process specified in pid does not exist or is not a child of the calling process. (This can happen for one's own child if the action for SIGCHLD is set to SIG_IGN. See also the LINUX NOTES section about threads.)

    Il est possible que ton cas se présente si esd fork et exit le père pour (théoriquement) se détacher du terminal/process appelant. Enfin non même dans ce cas-là tu devrais obtenir l'exitstatus du père qui exit je pense. Enfin bon c'est déjà une piste :).
    • [^] # Re: meuh

      Posté par  . Évalué à 2.

      Merci pour ta réponse, cela correspond a ce que j'imaginais, je vais donc virer la fonction system de mon code et la remplacer par les combinaisons de fonctions liées à fork car d'aprés les man la gestion des signaux est mieux gérée dans celles-ci.
    • [^] # Re: meuh

      Posté par  . Évalué à 2.

      Une autre idée : il y a peut-être une erreur dans le char* que tu passes à system(3), qui ferait échouer le lancement du programme que tu comptes lancer. Du coup, et en supposant que ce n'est pas fork(2), mais vfork(2), qui est appelé par system(3), il y aurait un échec de création du fils, avec mise du fils raté dans un état bizarre, qui pourrait amener cette situation.

      Enfin, ce n'est qu'une idée personnelle. Je te conseille de faire comme tu l'as dit, à savoir d'appeler fork(2), execvp(2) et waitpid(2), et d'éviter comme la peste le très inutile vfork(2).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.