nicht hinaus.
Leider kann ich nur mit printf debuggen, und ich kann nicht in die
close()
Funktion reinspringen.
Deshalb: hat jmd eine Vermutung woran das liegen koennte? Irgendwas, das
mich evtl auf den richtigen Weg fuehrt?
Danke
Hängt er wirklich, oder siehst Du nur nichts mehr, weil Du stdout
(worauf printf schreibt) geschlossen hast? Habe noch nie probiert, ob
das geht, oder was dann passiert...
Leite die Ausgabe mal in eine Datei um.
info("process was successfully daemonized: pid=%d sid=%d",pid,sid);
21
}
Konsolenausgabe:
1
c:235: Info: SID: -1
2
c:237: Error: setsid() failed: Operation not permitted
3
c:226: Info: PID: 0
4
zynq>
5
zynq> c:235: Info: SID: 701
6
exit
7
c:245: Info: __1
8
c:247: Info: __2
Tja, ich bin mir nicht sicher, ob das Ding wirklich haengt, oder ob ich
mit printf() an meine Grenzen stosse. Denn manchmal hoert die Ausgabe
schon bei "Error: setsid() failed" auf; ist halt ein forked-Prozess.
Und die letze Zeile "info("process was successfully daemonized" stammt
nicht von mir, sondern ist regulaerer Code einer geprueften
Implementierung. Aber die letzte Zeile wird nie ausgegeben.
Vielleicht hat's was mit der BusyBox zu tun...
Ich weiß nicht, worauf du arbeitest, aber warum schließt du stdout
überhaupt? Oder mache nur ich das nicht und es ist schlechter Stil, das
offen zu lassen?
Ersetze sonst mal die printfs() durch fprintf() in eine Datei. ...Oder
guck Dir mit strace/gdb an, was dort passiert.
Sieht so aus, als kommt nur nix mehr an. Denn wenn Du eine Tür schließt,
kannst Du ja auch nicht mehr durchgehen...
olpo schrieb:> Tja, ich bin mir nicht sicher, ob das Ding wirklich haengt, oder ob ich> mit printf() an meine Grenzen stosse.
Was macht info()? Ist das nur ein printf? Dann wäre das doch genau das
erwartete Verhalten. Wenn du stdout schließt, kannst du danach natürlich
nichts mehr nach stdout schreiben, genau wie bei anderen Files. Was
hättest du denn erwartet?
und 'info' hängt hoffentlich an den auszugebenden Text auch noch ein \n
hinten drann. Denn sonst ist nicht garantiert, dass das gepufferte auch
noch rausgeschrieben wird, ehe dann der Stream geschlossen wird.
Aus dem Codestück heraus vermute ich mal, du willst einen daemon
erzeugen? vorher käme noch ein setsid(), und bitte ein doppeltes fork().
Wenn ja, dann bitte nicht stderr schließen.
Frank K. schrieb:> Ich rate mal zu meinen Gunsten dass es sich um Linux handelt. Da hilft> mir oft strace weiter.
strace hilft bei daemons nur begrenzt
Michael Reinelt schrieb:> strace hilft bei daemons nur begrenzt
Da müsstest Du jetzt ein wenig präziser werden. Ich habe strace schon
mit daemons und auch mot Threads benutzt. Man muss da allerdings mit -p
arbeiten. Welche Limitierungen meinst Du?
> strace hilft bei daemons nur begrenzt
Mit den richtigen Optionen kann strace auch Kindprozesse verfolgen, oder
sich an laufende Prozesse anhängen. Siehe Manpage von strace.
Rolf Magnus schrieb:> Was macht info()? Ist das nur ein printf? Dann wäre das doch genau das> erwartete Verhalten. Wenn du stdout schließt, kannst du danach natürlich> nichts mehr nach stdout schreiben, genau wie bei anderen Files. Was> hättest du denn erwartet?
Das ist irgendein Makro. Damit bin ich aber zum ersten Mal konfrontiert,
ich kann das also noch nicht recht lesen.
Michael Reinelt schrieb:> Aus dem Codestück heraus vermute ich mal, du willst einen daemon> erzeugen? vorher käme noch ein setsid(), und bitte ein doppeltes fork().
Hmm, nee der macht fork() nur einmal. Wie gesagt, das ist ein opensource
Projekt, das ich auf ARM und BusyBox laufen lassen will. Ob der Code
schoen ist, kann ich nicht beurteilen.
http://prdownload.berlios.de/tpm-emulator/tpm_emulator-0.7.4.tar.gz
Ich habe die betreffenden Zeilen jetzt einfach mal auskommentiert. Zwar
kommt er jetzt bis info(__3), aber die letzte Zeile schafft er immer
noch nicht. Debuggen mit printf hat wohl seine Grenzen...
1
info("__1");
2
close(STDIN_FILENO);
3
info("__2");
4
// close(STDOUT_FILENO);
5
info("__3");
6
printf("__3.1");
7
// close(STDERR_FILENO);
8
is_daemon=1;
9
info("__4");
10
info("process was successfully daemonized: pid=%d sid=%d",pid,sid);
Das Problem war tatsächlich BusyBox.
Das kann kein fork(), sondern nur vfork().
Schlau wie BusyBox ist, wird fork() ohne Warnung(!) einfach mit vfork()
ausgetauscht & ausgeführt. Und mit vfork() klappt Deamonising nicht.
olpo schrieb:> Das Problem war tatsächlich BusyBox.> Das kann kein fork(), sondern nur vfork().> Schlau wie BusyBox ist, wird fork() ohne Warnung(!) einfach mit vfork()> ausgetauscht & ausgeführt. Und mit vfork() klappt Deamonising nicht.
Ähhh... BusyBox ist doch so eine Art "Micro-Shell" wo viele
Shell-Kommandos von ein und demselben binary ausgeführt werden.
fork() liegt doch wenn in der libc?
oder hast du da eine "Micro-libc" drauf?
Das liegt nicht an Busybox selber, sondern offenbar an deiner
Hardware-Plattform, für die Busybox offenbar einen Work-Around
integriert hat. Siehe http://www.busybox.net/FAQ.html#tips_vfork