[so] [Tema2][Linux] Implementare ca deamon

Lucian Adrian Grijincu lucian.grijincu at gmail.com
Thu Apr 9 00:51:32 EEST 2009


2009/4/9 Sergiu Iordache <sergiu.iordache at gmail.com>:
> În textul temei scrie că serverul trebuie implementat ca deamon. Din
> ce am citit pe net asta presupune un fork cu exit pe părinte și
> continuare în copil. Așa e?

Dacă e să o faci *corect* sunt multe chestii implicate. Din cauza
asta, Debianul de ex. aduce în pachetul dpkg și un executabil
start-stop-daemon (apt-get source dpkg, în utils/start-stop-daemon.c).


pe scurt:
1. fork() cu exit în părinte pentru a se despărți de părinte.
Părintele nou e init.
2. se desparte de sesiunea părintelui cu setsid, și se eliberează de
un terminal de control cu setsid(). Deoarece nu mai e conectat la
terminal, nu va mai primi semnale SIGHUP când se va închide shellul
care l-a pornit.
3. Dacă stdout era conectat la tty înainte de fork(), trebuie
redirectat sau într-un fișier de logging (de ex. syslog) sau în
/dev/null: poți scrie la infinit fără să se umple bufferul. Similar cu
stderr. stdin: dacă era un tty se conectează tot la /dev/null: orice
citire se termină cu EOF. Oricum nu avea cum citi dacă s-ar fi închis
bash-ul, un proces daemon n-are ce citi de la un tty, așa că /dev/null
nu are ce să-i strice.
4. Se inchid toți descriptorii de fișiere >= 3 de care nu e nevoie. E
posibil să fi rămăs deschise fișiere și să se fi moștenit prin fork()
exec() de cine știe când. Deoarece încă există o referință deschisă,
nu pot fi șterse.
5. se schimbă directorul curent: exită o referință deschisă către
acesta din procesul curent și nu poate fi șters. în general se alege
chdir("/"); Problema e că toate căile trebuie date relativ la noul
director curent.
ș.a.

pe lung:
http://www.enderunix.org/docs/eng/daemon.php

> Și dacă da, care e avantajul față de un (mai simplu) "./server &" în bash?

Când închizi shellul serverul primește SIGHUP, și dacă nu ignoră sau
tratează într-un mod specific semnalul ăsta va fi omorât. De ex. dacă
te conectezi la distanță prin ssh, ssh deschide un shell și-l va
închide automat la închiderea conexiunii.

-- 
 .
..: Lucian


More information about the so mailing list