Programm in einem C-Programm ausführen

7

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.

    
Simon 16.09.2008, 09:52
quelle

6 Antworten

17

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.

>     
freespace 16.09.2008, 09:54
quelle
8

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%     
Steve Baker 17.09.2008 13:53
quelle
7
  1. Erstellen Sie zwei Rohre mit pipe(...) , eins für stdin , eins für stdout .
  2. fork(...) der Prozess.
  3. Im untergeordneten Prozess (der Prozess, in dem fork(...) 0 zurückgibt) dup (...) die Pipes in stdin / stdout .
  4. exec[v][e] Die zu startende Programmdatei im Child-Prozess.
  5. Geben Sie im übergeordneten Prozess (dem mit 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(...) ).
  6. Geben Sie dem Kind schließlich eine Eingabe in stdin , wenn es etwas erwartet.
  7. Wenn fertig, close(...) die Rohre.
Jorge Ferreira 16.09.2008 09:56
quelle
4

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.

  1. Es ist wichtig, dass der übergeordnete Prozess das Leseende der Pipe schließt, die zum Senden von Nachrichten an den untergeordneten Prozess verwendet wird.
  2. Es ist wichtig, dass der untergeordnete Prozess das Schreibende der Pipe schließt, die zum Senden von Nachrichten an den untergeordneten Prozess verwendet wird.
  3. Es ist wichtig, dass der Elternprozess das Schreibende der Pipe schließt, die zum Senden von Nachrichten an den übergeordneten Prozess verwendet wird.
  4. Es ist wichtig, dass der untergeordnete Prozess das Leseende der Pipe schließt, die zum Senden von Nachrichten an den übergeordneten Prozess verwendet wird.

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.

    
Jonathan Leffler 17.09.2008 07:42
quelle
0

Ich denke, du kannst

verwenden
  

freopen

dafür.

    
Vhaerun 16.09.2008 09:56
quelle
0

Sie können den Systemaufruf verwenden und die Hilfeseite für System (3)

lesen     
xenog 16.09.2008 10:15
quelle

Tags und Links