System Calls - pipe - stdin stdout umleiten
-
Ich habe einen "Server" programmiert, der diverse "Applicationen" starten, stoppen, ... kurzum verwalten soll.
Die Applicationen sollen über Systemcalls gestartet werden, und über STDIN und STDOUT gesteuert werden.
--> Konzeptuell sollte das funktionieren (habe ich an der Stelle schon einen Denkefehler, so heraus mit der sprache)Ein paar meiner bisherigen Lösungsversuche:
a) 1. pipe --> 2. fork --> 2.1 child: dub2() --> 2.2 child: system("application") ->3.1 parent: read(pipe[0])
dumm nur, dass system("application") nicht umgeleitet wird; jedoch system("ls -la") ...und dass soll einer verstehen.b) 1. int pipe = popen("application >> logfile.log", "w");
soweit gar nicht schlecht, kann über pipe die application steuern
nicht so gut ist leider, dass das Logfile erst nach Beenden der Application geschrieben wird (keine ahnung wie man das umgehen kann)c) pthread_create --> pipe --> dub2
Leider eine Schnapsidee, so leitet man den gesamten Prozess um (also den Server), und ich möchte nur die Applicationen umleiten.d) ...
langsam bin ich am verzweifeln...
ich hoffe jemand kann meinen gedanken folgen...
kurzum, alles was ich möchte ist,
mehrere Anwendungen starten, und von diesen STDIN, STDERR und STDOUT umleiten.Ich bin für jeden Tip sehr dankbar!!!
-
Sollte mal ein Mod nach Linux schubsen, da das wohl doch nur mit Systemcalls geht.
Ansonsten schau dir mal boost an und da "Interprocess Memory" :). Das dürfte evtl deinen Anforderungen gerecht werden.
rya.
-
noch eine kleiner nachtrag...
int pipes[2]; pipe(pipes); if (fork() == 0) { dup2(pipes[1], STDOUT_FILENO); dup2(pipes[1], STDERR_FILENO); dup2(pipes[0], STDIN_FILENO); // execlp("./dir/myapp", "myapp", NULL); execlp("ls", "ls","/tmp", NULL); } else { char buffer; while (read(pipes[0], &buffer, 1) > 0) { printf("%c-", buffer); } close(pipes[0]); }
ausgabe:
h-s-p-e-r-f-d-a-t-a-_-u-s-e-r- -k-e-y-r-i-n-g---F-Z-r-w-D-J- -k-e-y-r-i-n-g---m-J-O-0-k-f- -o-r-b-i-t---u-s-e-r- -p-l-u-g-t-m-p- -t-u-s-b-l-o-g-
Was auch mit "ls /tmp" funktioniert, jedoch nicht mit einer eigenen c++ anwendung "./dir/myapp"
kommentiere ich "dup2(pipes[1], STDOUT_FILENO);" aus
// dup2(pipes[1], STDOUT_FILENO);
so wird meine Anwendung ausgegeben...irgendetwas habe ich hier übersehen ... irgendetwas habe ich nicht bedacht!
ich bin über jeden rat dankbar!!!
-
ok...
werde mich um einen anderen lösungsansatz kümmern, und schauen dass ich das problem mit sockets löse
gruss an alle die ähnliche probleme haben
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ganz klar ist mir nicht, wo das problem ist. du hast dub2 schon entdeckt. super. jetzt noch fork und ein exec* deiner wahl und fertig ist es. umleiten in eine datei bedeutet nur, dass du die datei nach dem fork öffnest und per dub2 einfach stdout zu diesem file descriptor umbiegst. die pipe brauchst du nur, wenn eltern und kindprozesse miteinander kommunizieren sollen.