Wie soll ich ein anderes Programm in meinem C
Programm ausführen? Ich muss in der Lage sein, Daten in STDIN
des gestarteten Programms zu schreiben (und vielleicht von seinem STDOUT
zu lesen)
Ich bin mir nicht sicher, ob das eine Standard-C-Funktion ist. Ich brauche die Lösung, die unter Linux funktionieren sollte.
Sie möchten popen
verwenden. Es gibt Ihnen eine unidirektionale Leitung, mit der Sie auf stdin und stdout des Programms zugreifen können.
popen ist Standard auf modernen Unix- und Unix-ähnlichen Betriebssystemen, von denen Linux eins ist: -)
Geben Sie
ein %Vor%in einem Terminal, um mehr darüber zu lesen.
BEARBEITEN
Ob popen
unidirektionale oder bidirektionale Pipes erzeugt, hängt von der Implementierung ab. In Linux und OpenBSD , popen
erzeugt unidirektionale Pipes, die schreibgeschützt oder schreibgeschützt sind. Auf OS X , FreeBSD und NetBSD popen
erzeugt bidirektionale Pipes.
Ich habe vor einiger Zeit einen Beispiel-C-Code für jemand anderen geschrieben, der zeigt, wie man das macht. Hier ist es für dich:
%Vor%pipe(...)
, eins für stdin
, eins für stdout
. fork(...)
der Prozess. fork(...)
0 zurückgibt) dup (...)
die Pipes in stdin
/ stdout
. exec[v][e]
Die zu startende Programmdatei im Child-Prozess. fork
) die PID des untergeordneten Elements an eine Schleife aus, die aus dem stdout
des untergeordneten Elements ( select(...)
oder poll(...)
, read(...)
) in einen Puffer liest. bis zum
Kind wird beendet ( waitpid(...)
). stdin
, wenn es etwas erwartet. close(...)
die Rohre. Ich stimme nicht mit Nathan Fellman überein - die andere Frage ist kein Duplikat davon, obwohl das Thema verwandt ist.
Für einfache unidirektionale Kommunikation ist popen () eine gute Lösung. Es ist jedoch nicht für bidirektionale Kommunikation.
IMO, imjorge (Jorge Ferreira) gab den Großteil der Antwort (80%?) für die bidirektionale Kommunikation - aber einige wichtige Details weggelassen.
Wenn Sie die nicht verwendeten Enden der Pipes nicht schließen, erhalten Sie kein vernünftiges Verhalten, wenn eines der Programme beendet wird; zum Beispiel liest das Kind möglicherweise von seiner Standardeingabe, aber wenn das Schreibende der Pipe im Kind nicht geschlossen ist, erhält es niemals EOF (null Bytes vom Lesen), weil es immer noch die Pipe geöffnet hat und das System es denkt könnte irgendwann dazu übergehen, an diese Pipe zu schreiben, obwohl sie gerade darauf wartet, dass etwas von ihr liest.
Die Schreibprozesse sollten überlegen, ob das SIGPIPE-Signal behandelt werden soll, das beim Schreiben in eine Pipe angegeben wird, in der es keinen Lesevorgang gibt.
Sie müssen sich der Pipe-Kapazität bewusst sein (abhängig von der Plattform und möglicherweise nur 4 KB) und die Programme so gestalten, dass Deadlocks vermieden werden.
Sie können den Systemaufruf verwenden und die Hilfeseite für System (3)
lesen