erstmal danke fuer die antwort.
ich fürchte, auch mit guten heuristiken würde es die von dir gesuchte magische get_stdout()-funktion nicht schaffen zu eruieren, was du denn gerne als neuen stdout hättest (den alten gibts ja dann nicht mehr).
sehe ich genau so. es wuerde mich wundern wenn es die magie gaebe, aber ich habe gehofft es kennt vlt. jemand einen C-trick, der mir noch nicht unter gekommen ist.
i
schau dir mal
an, das erklärt, warum freopen() nicht geht.
jop, hab ich gemacht und es ist mir auch vollkommen klar warum es so nicht funktioniert. das einzige was geht ist ein backup machen, dann bis aufs backup closen, mir "/dev/fd/$BACKUP" zusammenbaun und ein freopen machen. aber das waer ja unlustig, ich will ja alle schlieszen, auch das backup
und wie liest du dann von deinem dämon aus über stdin/out von einem anderen prozess daten ein? bzw. wozu brauchst du da stdin/stdout, du kannst ja einfach so ein(e) datei/pipe/socket öffnen. oder anders gefragt, was ist denn bei dir stdin und stdout für den dämon?
ich denke das funktioniert nicht so einfach. bitte korrigiert mich wenn ich in sysprog nicht gut aufgepasst habe, aber ich lege die pipe an, forke meinen daemon und rufe dann im parent ein exec auf. ueber das aufgerufene parent programm habe ich nicht wirklich kontrolle, dem kann ich auch nicht sagen dass es auf pfd (den ich durch pipe() erzeugt habe) schreiben soll. dieses programm schreibt einfach auf "seinen" stdout. den hab ich aber vorher geschlossen (weit vor dem fork).
ich zeigs dir anhand folgendem test-code.
dummy.c: ueber das programm habe ich keine keine kontrolle, das ist einfach so vorhanden:
#include <stdio.h>
int main(int argc, char **argv)
{
printf("%s spricht\n", argv[0]);
return 0;
}
daemon.c: so ist ca mein daemon aufgebaut. das daemonize() wird einfach durch das schlieszen der deskriptoren 0-9 simuliert:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#define SIZE 1024
int main(int argc, char **argv)
{
int pfd[2];
int pid,i;
int nread;
char buf[SIZE];
/* SIMULATE daemonize() */
/* for(i = 0; i < 10; i++) */
/* close(i); */
if (pipe(pfd) == -1)
{
perror("pipe failed");
exit(EXIT_FAILURE);
}
if ((pid = fork()) < 0)
{
perror("fork failed");
exit(EXIT_FAILURE);
}
if (pid == 0) /* child */
{
close(pfd[1]);
dup2(pfd[0], STDIN_FILENO);
bzero(buf, SIZE);
while ((nread = read(pfd[0], buf, SIZE)) != 0)
{
printf("got input:%s",buf);
}
exit(EXIT_SUCCESS);
}
else /* parent */
{
close(pfd[0]);
dup2(pfd[1], STDOUT_FILENO);
close(pfd[1]);
execlp("./dummy", "dummy",
(char *) 0);
exit(EXIT_SUCCESS);
}
return EXIT_SUCCESS;
}
Alles anzeigen
das funktioniert so auch ganz gut wenn man "daemon" startet, nur sobald man die die zwei zeilen fuer das simulierte daemonize auskommentiert spricht gar nix mehr.