OVH Cloud OVH Cloud

Surveiller la vie d'un processus (en C)

20 réponses
Avatar
JKB
Bonjour à tous,

Suite à mes interrogations sur les pipes en C, j'ai un autre petit
truc à vous soumettre... J'ai googlisé, RTFMer sans trop de succès.
Comment puis-je à partir d'un programme écrit en C surveiller qu'un
processus n'est pas mort (en fait, le processus fils généré par le
fork(), pour pouvoir fermer mon pipe() du côté du père.) ?
J'aimerais aussi que ce soit portable...

Cordialement,

JKB

10 réponses

1 2
Avatar
Miod Vallat
Je crois que c'est ce que je vais faire. kill(pid, 0) me renvoie un
code d'erreur non documenté (122 !).


Tu tournes sous quel système ?

Avatar
JKB
Le 17-12-2004, à propos de
Re: Surveiller la vie d'un processus (en C),
Miod Vallat écrivait dans fr.comp.os.unix :
Je crois que c'est ce que je vais faire. kill(pid, 0) me renvoie un
code d'erreur non documenté (122 !).


Tu tournes sous quel système ?


J'ai fait le test sur un Linux/Sparc. 122 ne correspond à aucune des
valeurs censées être retournée par kill() dans errno qui sont 22 (EINVAL),
1 (EPERM) ou 3 (ESRCH). kill() renvoie pourtant bien une erreur.
Si j'ai le courage, je ferai un test sous Solaris, mais je vais devoir
rebooter le ronrondrome de Schroedinger ;-)

JKB


Avatar
Miod Vallat
Tu tournes sous quel système ?


J'ai fait le test sur un Linux/Sparc. 122 ne correspond à aucune des
valeurs censées être retournée par kill() dans errno qui sont 22 (EINVAL),
1 (EPERM) ou 3 (ESRCH). kill() renvoie pourtant bien une erreur.
Si j'ai le courage, je ferai un test sous Solaris, mais je vais devoir
rebooter le ronrondrome de Schroedinger ;-)


asm-sparc*/errno.h contiennent
#define EILSEQ 122 /* Illegal byte sequence */

Et EILSEQ n'est utilisé que dans le code usb, blootooth, et deux
systèmes de fichiers.

Amusant.


Avatar
JKB
Le 17-12-2004, à propos de
Re: Surveiller la vie d'un processus (en C),
Miod Vallat écrivait dans fr.comp.os.unix :
Tu tournes sous quel système ?


J'ai fait le test sur un Linux/Sparc. 122 ne correspond à aucune des
valeurs censées être retournée par kill() dans errno qui sont 22 (EINVAL),
1 (EPERM) ou 3 (ESRCH). kill() renvoie pourtant bien une erreur.
Si j'ai le courage, je ferai un test sous Solaris, mais je vais devoir
rebooter le ronrondrome de Schroedinger ;-)


asm-sparc*/errno.h contiennent
#define EILSEQ 122 /* Illegal byte sequence */

Et EILSEQ n'est utilisé que dans le code usb, blootooth, et deux
systèmes de fichiers.

Amusant.


Oui, bizarre...

JKB



Avatar
Alain Ketterlin
JKB writes:

Suite à mes interrogations sur les pipes en C, j'ai un autre petit
truc à vous soumettre... J'ai googlisé, RTFMer sans trop de succès.
Comment puis-je à partir d'un programme écrit en C surveiller qu'un
processus n'est pas mort (en fait, le processus fils généré par le
fork(), pour pouvoir fermer mon pipe() du côté du père.) ?


waitpid(2) avec l'option WNOHANG ?

J'aimerais aussi que ce soit portable...


Il est dit que c'est POSIX dans la page de man (sous linux 2.6). A
verifier.

-- Alain.

Avatar
Nicolas George
Laurent Wacrenier wrote in message
:
On a un SIGPIPE quand on essaye d'écrire dans un PIPE et que l'autre
extremité est fermée.


Précisons encore : seulement à la deuxième tentative d'écriture (et plus
tard si on a survécu), la première signalera une condition de fin de fichier
(0 octets écrits).

Avatar
Stephane Chazelas
2004-12-17, 18:11(+00), Nicolas George:
Laurent Wacrenier wrote in message
:
On a un SIGPIPE quand on essaye d'écrire dans un PIPE et que l'autre
extremité est fermée.


Précisons encore : seulement à la deuxième tentative d'écriture (et plus
tard si on a survécu), la première signalera une condition de fin de fichier
(0 octets écrits).


??? Sur quel systeme ?

--
Stephane


Avatar
DINH Viêt Hoà

Laurent Wacrenier wrote in message
:
On a un SIGPIPE quand on essaye d'écrire dans un PIPE et que l'autre
extremité est fermée.


Précisons encore : seulement à la deuxième tentative d'écriture (et plus
tard si on a survécu), la première signalera une condition de fin de fichier
(0 octets écrits).


extrait du manuel POSIX :

<<
An attempt is made to write to a pipe or FIFO that is not open for
reading by any process, or that only has one end open. A SIGPIPE signal
shall also be sent to the thread.




Il n'indique pas le comportement que tu décris.
Où as-tu lu cela ?

--
DINH V. Hoa,

"tu as bientot 15 ans, faut que tu commences à être autonome" -- jul


Avatar
DINH Viêt Hoà

Le 17-12-2004, à propos de
Re: Surveiller la vie d'un processus (en C),
Eric Jacoboni écrivait dans fr.comp.os.unix :
JKB writes:

Envoyer un kill(pid, 0) ?


Groumphfff... J'ai tout cherché et je l'avais sous les lunettes...


Cela dit, comme on l'a dit plus haut, le détournement de SIGCHLD me
semble plus "propre" lorsqu'il s'agit, pour un père, de savoir que son
fils est mort.


Je crois que c'est ce que je vais faire. kill(pid, 0) me renvoie un
code d'erreur non documenté (122 !).


Je crois qu'Eric parlait plutôt de l'interception du signal SIGCHLD et
non pas de kill(pid, 0)

--
DINH V. Hoa,

"tu as bientot 15 ans, faut que tu commences à être autonome" -- jul




Avatar
Nicolas George
Stephane Chazelas wrote in message
:
??? Sur quel systeme ?


Effectivement, j'ai halluciné. J'étais persuadé que c'était le comportement
avec les sockets, mais même là, je n'arrive pas à le reproduire.

1 2