2016-06-23 14 views
0

Ich versuche, mir selbst etwas Umleitung beizubringen. Und ich habe folgendes Problem:Mit Pipes und exec(), um eine andere Konsolenanwendung zu steuern

Ich habe ein einfaches Programm, das den Benutzer für eine ganze Zahl fragt und gibt dann einige andere Zahlen, tut es, dass auf unbestimmte Zeit, bis der Benutzer 0 eintritt, dann schließt es.

Ich versuche, einen Wrapper für das Programm, in der Zukunft schreiben könnte es einig GUI-Wrapper für eine andere Konsole-Anwendung sein. Ziel ist es, mit diesem Programm zu kommunizieren.

Mein erster Gedanke war, Rohre zu verwenden, um den Prozess Gabel, setzen Sie die Rohre auf die stdin und stdout des Kindes Prozess und dann exec() der Konsolenanwendung.

Nun, mein Code so funktioniert noch nicht richtig, da die Konsole-Anwendung nicht ausgeführt werden soll, aber es läuft wie üblich, in der Konsole, wird der Ausgang nicht gehen, wo ich es gehen will.

main() 
{ 
    int master_to_slave[2]; 
    int slave_to_master[2]; 

    pipe(master_to_slave); 
    pipe(slave_to_master); 

    int pid; 

    if((pid=fork())==0){ 
    close(master_to_slave[1]); 
    close(slave_to_master[0]); 
    dup2(0, master_to_slave[0]); 
    dup2(1, slave_to_master[1]); 
    char *args[] = { NULL }; 
    execv("/home/ebach/Documents/HIWI/random.exe",args); 
    } 
    else if(pid<0){ 
    //ALARM ALARM 
    } 
    else{ 
    close(master_to_slave[0]); 
    close(slave_to_master[1]); 

    while(1){ 
     char buff[16]; 
     int rd = read(slave_to_master[0], &buff, sizeof(buff)); 
     if(rd > 0){ 
     buff[rd-1] = '\0'; 
     printf("Redirected: "); 
     for(int i = 0; i < rd; i++){ 
    printf("T%c", buff[i]); 
     } 
     printf("\n"); 
     } 
    } 
    wait(NULL); 
    } 
} 

Bis jetzt soll es nur die Ausgabe der Konsolen-App umleiten. (Wie Sie sehen können es sollte noch hinzufügen, nur ‚Weitergeleitet:‘

Anyways, ich bin nicht ganz beherrschen c wie Sie sehen können, so kann ich den Fehler nicht finden

Habe ich ‚Connect‘ das. falsche Rohre?

Eine andere Lösung, die ich stieß war die Verwendung von Pseudo-Terminals von forkpty mit() und exec(), sollte ich gehen diesen Weg?

Vielen Dank für jede Hilfe im Voraus!

Antwort

2

Sie haben dup2 rückwärts verwendet, pro man page: int dup2(int fildes, int fildes2);dup2 bewirkt, dass filedes2 auf dieselbe geöffnete Datei verweist wie filedes.

+0

Zusätzlich nach richtig düpiert die ursprünglichen FDs, die auf den Standard-Streams hinters Licht geführt wurden sollte geschlossen sein. –

+0

Danke, das löst mein Problem. –

2

@hacatu scheint Ihr Hauptproblem in seiner Antwort identifiziert zu haben. Zusätzlich

  • wie ich kommentierte hacatu Antwort, sobald das Kind dup2() ein Rohr auf eine des Standard-Streams beenden s, sollte es diesen Rohrende schließen. Zum Beispiel
dup2(slave_to_master[1], 1); 
    close(slave_to_master[1]); 
  • das Argument Vektor execv() oder execvp() vorgestellt und die die verhandelt Listen execl(), execlp() oder execle() Karte direkt an das Zielprogramm argv Vektor. Daher ist es üblich, dass es mindestens ein Element gibt, das das ausführende Programm benennt. Einige Programme verlassen sich darauf. Zum Beispiel:
char *args[] = { "random.exe", NULL }; 
    execv("/home/ebach/Documents/HIWI/random.exe", args); 

Sie könnten execl() etwas bequemer in diesem Fall finden, aber:

execl("/home/ebach/Documents/HIWI/random.exe", "random.exe", NULL); 
+0

Vielen Dank für die Eingabe, da ich mir nicht wirklich sicher war, welcher Manager der Richtige für mich war. Jetzt kämpfe ich mit einem anderen Problem: Der Elternprozess scheint seltsamerweise nichts auszugeben. Und anscheinend liegt der Fehler nicht bei der Lesefunktion, da sie diese nicht erreicht. Soweit ich weiß, habe ich einige printf() -Funktionen eingefügt, um sie zu testen. –

Verwandte Themen