Comment faire un démon sous Linux/unix? - C - Programmation
Marsh Posté le 10-03-2004 à 18:39:37
faut faire un double fork, changer l'id, rajouter un wait pour éviter un defunct, etc. voici un code en python
Code :
|
tu peux également éviter le double fork en manipulant le signal SIGCHLD de façon à ce que SA_NOCLDWAIT soit gérer par SIG_IGN
Marsh Posté le 10-03-2004 à 18:46:12
c'est moi ou la plupart des trucs sous nux se font pas chier à tout ça et ont un script de démarrage qui les lancent betement avec un & à la fin de la commande?
Marsh Posté le 10-03-2004 à 18:47:11
the real moins moins a écrit : c'est moi ou la plupart des trucs sous nux se font pas chier à tout ça et ont un script de démarrage qui les lancent betement avec un & à la fin de la commande? |
non taz a raison et sinon il faut au moins faire un nohup avec votre méthode.
Marsh Posté le 10-03-2004 à 18:48:21
the real moins moins a écrit : c'est moi ou la plupart des trucs sous nux se font pas chier à tout ça et ont un script de démarrage qui les lancent betement avec un & à la fin de la commande? |
oui mais le code exécuté y a tout ce qu'il faut. l'important pour un daemon, c'est qu'il dépende de init.
Marsh Posté le 10-03-2004 à 18:48:47
je dis pas que taz à tord, mais j'ai juste l'impression que bcp de softs ne se cassent pas la tête à faire ça proprement ?
Marsh Posté le 10-03-2004 à 18:49:35
Taz a écrit : oui mais le code exécuté y a tout ce qu'il faut. l'important pour un daemon, c'est qu'il dépende de init. |
euh, jsais pas ce que ça veut dire, mais ok
Marsh Posté le 10-03-2004 à 18:50:51
ben qu'ils sont détaché de leur parent, pour ne pas souffrir de la mort de ce processus. init, c'est le processus initial, si tu ne dépend que de init, tu ne te termineras que si init se termine
Marsh Posté le 10-03-2004 à 18:51:50
the real moins moins a écrit : je dis pas que taz à tord, mais j'ai juste l'impression que bcp de softs ne se cassent pas la tête à faire ça proprement ? |
je ne connais pas bien linux mais sous un unix lorsque le shell à partir duquel on lance le process se terminera, le process "daemon" va recontrer des chtits soucis.
Marsh Posté le 10-03-2004 à 18:53:12
Taz a écrit : ben qu'ils sont détaché de leur parent, pour ne pas souffrir de la mort de ce processus. init, c'est le processus initial, si tu ne dépend que de init, tu ne te termineras que si init se termine |
en clair si on ne code pas ça proprement, le script n'est safe que lors du boot ce qui n'est quand même pas terrible terrible...
Marsh Posté le 10-03-2004 à 19:06:49
Taz a écrit : ben qu'ils sont détaché de leur parent, pour ne pas souffrir de la mort de ce processus. init, c'est le processus initial, si tu ne dépend que de init, tu ne te termineras que si init se termine |
ok
Marsh Posté le 10-03-2004 à 19:08:57
moins moins a écrit : euh, jsais pas ce que ça veut dire, mais ok |
même moi je connais init
(bon ok, juste la théorie, mais tout de même de quoi dire je connais init )
Marsh Posté le 10-03-2004 à 20:09:58
est ce qu'un :
nohup monprog &
suffit ?
edit: oups, j'avais loupé le post de DocMaboul
Marsh Posté le 10-03-2004 à 20:20:22
nico168 a écrit : est ce qu'un : |
Ca suffit pour lancer un process en fond de manière safe mais pour un démon, c'est pas terrible. Si mes souvenirs sont bons, ça peut aussi poser des petits problèmes avec les signaux.
Marsh Posté le 10-03-2004 à 20:24:11
DocMaboul a écrit : |
à la bonne heure, c'est un peut tout ce que j'explique dans mon premier message
Marsh Posté le 10-03-2004 à 20:28:22
Taz a écrit : à la bonne heure, c'est un peut tout ce que j'explique dans mon premier message |
Non. Ton premier message n'explique rien : il assène.
Marsh Posté le 10-03-2004 à 20:29:20
bah ouais, quand je dis qu'il faut détourner SIGCHLD vers SIG_IGN, personne se doute que c'est pour pallier les problèmes de signaux
Marsh Posté le 10-03-2004 à 20:42:36
Taz a écrit : bah ouais, quand je dis qu'il faut détourner SIGCHLD vers SIG_IGN, personne se doute que c'est pour pallier les problèmes de signaux |
Oui en fait tu as raison. C'est pour ça que rien ne sert de commenter son code : il parle toujours de lui-même.
Marsh Posté le 10-03-2004 à 20:48:59
DocMaboul a écrit : |
le fait est que je n'ai pas donné de code sur ceci, et que le code que j'ai fournit par ailleurs est suffisemment clair
Marsh Posté le 10-03-2004 à 20:57:02
Taz a écrit : le fait est que je n'ai pas donné de code sur ceci, et que le code que j'ai fournit par ailleurs est suffisemment clair |
Ratiocine tant que tu veux, cela ne changera pas le fait que ton premier message n'explique rien.
Et sur ce, bonsoir. Il est temps d'aller se faire glouglouter le poireau...
Marsh Posté le 10-03-2004 à 20:59:53
Taz a écrit : faut faire un double fork, changer l'id, rajouter un wait pour éviter un defunct, etc. voici un code en python
|
bien le merci mais je cherche une documentation en C
Marsh Posté le 10-03-2004 à 21:13:41
non mais tu le fais expres ou quoi ?
tu vois les fork, le exec, le wait, setsid ? oui ? ben tu fais pareil en C
Marsh Posté le 10-03-2004 à 22:57:10
OK y'a du nouveau!
J'ai trouvé deux docs d'Unix qui en traitent, et qui sont assez "parentes":
http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
http://www.santal.org/proglinux/pr [...] tml#ss11.5
D'après les tests que j'ai fait ça a l'air de marcher. Je vous tiendrais au courant merci de votre aide!
Marsh Posté le 10-03-2004 à 23:02:19
genre ça serait pas exactement ce que je t'ai dit de faire ?
Marsh Posté le 28-04-2005 à 15:03:47
Bon, je déterre de topic /0\
Je cherche aussi a programmer un démon en C qui ecoute un port série et log ce qui arrive dans des fichiers. Cela fonctionne bien, quand je le lance en ligne de commande il passe direct à l'arriere plan.
Maintenant j'aimerai que ce démon s'execute au démarrage de la machine et soit ressuscité en cas de problème, j'ai donc ajouté une ligne genre:
id:23:respawnhome/user/prog/programme -blabla etc..
dans mon inittab. Le probleme c'est que quand je fais ça, je me retrouve apres redemarrage avec une 10aine d'instance du programme qui tournent, une idée ?
Marsh Posté le 28-04-2005 à 15:18:03
ne fais pas ça. utilise la ton /etc/init.d ou /etc/rc.d selon ta distribution.
Marsh Posté le 28-04-2005 à 15:20:29
et on peut faire en sorte que le processus soit ressuscité ?
Marsh Posté le 12-10-2005 à 12:02:41
Salut, regarde du coté de supervise , il y a runit aussi qui implemente les meme fonctionnalitées en remplacant init.
runit : http://smarden.org/runit1/
supervise : http://cr.yp.to/daemontools/supervise.html
Voila dsl pour le retard je viens de découvrir ce post :-)
Marsh Posté le 10-03-2004 à 18:33:37
Bonjour.
J'ai fait un programme C mais je veux qu'il tourne en tant que démon sous Linux. Pour le lancement, il suffit de l'ajouter sans /etc/init.d/ . Mais comment mon programme doit-il être conçu pour tourner en tant que démon. J'ai cherché de la doc la-dessus mais sans succès. Et vous?
---------------
.