A.L.E.C napisał(a):
Grzegorz Stanislawski wrote:
} else if (fval==0) { //child
+// //restore old handler so we can wait() for childs executed by modules +// sigaction (SIGCHLD,&orig, NULL) ;
to w końcu potrzebne to jest czy nie?
no wlasnie nie jestem pewien. dlatego jest wyhashowane. przy braku tego moga byc problemy z procesami odpalanymi przez moduly, a forki sa i w ping i w system i pewnie beda w nowych modulach. Dobrze by bylo przygotowac autorom modulu wmiare standardowe srodowisko Z drugiej strony jest to poki co niepotrzebne wywolanie systemowe. proponuje na razie to zostawic zachaszowane. Jak ktos beedzie mial taki problem przy pisaniu jakiegos modulu to bedzie mial gotowa podpowiedz.
- }else { //parent
- sleep(100);
z tym sleep(100) to coś nie bardzo, próbowałeś go uruchamiać z opcją -q, albo bez -qf
sleep ma pozwolic systemowi zajecie sie przez chwile potomkiem i przyniesc efekt w postaci mniejszego obciazenia systemu (choc zauwazalnosc tego jest nikla)
-qf jest rownowazne -q. -f nie wplywa na nic innego niz pierwszy fork co zreszta widac wyraznie w zrodlach.
zrobiłem tak: // forking reload - we can do a job for longer than one minute [..] else if( fval==0 ) //child { setsid(); // załatwia sprawę wyświetlania czegokolwiek na // stdout, ale nie wiem czy to jest właściwe
nie wydaje mi sie ze setsid tu ma jakikolwiek sens, jesli juz mialoby byc to tam gdzie caly lmsd sie demonizuje. poza tym setsid nie sluzy temu. Wyswietlanie na stdout nie jest niczym zlym a nawet jest porzytecznie. Mozna to puscic do pliku i zrobic w ten sposob loga. Tez nalezy sie zastanowic czy przy -q warto wogole forkowac worker threada. lmsd -q jest przeznaczone (imho) do puszczenia go z palca w shellu, albo w skrypcie i kazdy kto to puszcza chcialby widziec wynik (jesnie nie to zawsze mozna dac >/dev/null) i miec pewnosc ze reload sie skonczyl. zmiana jest banalna: if(quit) fval=fork() else fval=0; w 264 lini
// exit child (reload) thread if( quit ) termination_handler(0); // write info to syslog else exit(0);
} else if( quit ) exit(0);
Zupelnie nie rozumiem po co ci ten fragment (dokladnie czemu ma tak wygladac). mysle ze debug o "reload child exit" jest bardziej czytelny. exit(0) za klamerka to zakonczenie calego demona a wiec tam powinien byc termination_handler(0). exit(0) przed klamerka tu jak i w moim patchu mozna nawet pominiac. Inna sprawa ze zamiast tylu exitow, bardziej elegancko bylo by poslugiwac sie wyskakiwaniem z petli przez break.
Na razie chcialem aby moj patch byl jak najmniej inwazyjny w strukture programu. Mysle ze jest tu jeszcze sporo do zoptymalizowania.
Grzegorz Stanislawski