2016-06-09 9 views
0

Ich versuche, einen Linux-Befehl auszuführen, indem Sie in c Execvp verwenden, und es zeigt nichts an. Ich verstehe den Funktionsaufruf dup2() nicht ganz. Kann mir jemand sagen, was ich hier falsch mache?Ausgabe zeigt nichts, wenn die Befehle mit Systemaufruf in c weitergeleitet werden?

Befehl Auszuführen: ls | Art

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdbool.h> 

int main() 
{ 
    char *cmd[2], *cmd2[3]; 
    cmd[0] = "ls"; 
    cmd[1] = NULL; 
    cmd2[0] = "sort"; 
    cmd2[1] = NULL; 

    pid_t id; 

    id = fork(); 
    int pipe1[2]; 
    int pipe2[2]; 
    pipe(pipe1); 
    pipe(pipe2); 
    if(id==0) 
    { 
     printf("child process with pid =%d \r\n", getpid()); 
     //the read end of pipe not needed, 
     close(pipe1[0]); 
     // we want the stdout (1) of this process to be connected to 1 of pipe1. 
     dup2(pipe1[1],1); //or dups(pipe1[1], stdout_fileno) 
     //close it aswell not needed 
     //close(pipe1[1]); 
     execvp("ls",cmd); 
     return 1; 

    } 
    pid_t id2 = fork(); 

    if(id2==0) 
    { 
     close(pipe1[1]); 
     dup2(pipe1[0], 0); 
     close(pipe1[0]); 
     execvp("sort",cmd2); 
     //return 1; 
    } 

     close(pipe1[0]); 
     close(pipe1[1]); 
     waitpid(id,NULL,0); 
     waitpid(id2, NULL, 0); 

     //execvp("sort",cmd2); 
     //printf("parent process with pid =%d \r\n", getpid()); 

    return 0; 
} 
+1

Sie müssen 'pipe()' * vor * Sie 'fork()', wenn Sie möchten, dass die Pipe Eltern und Kind verbinden. – EOF

Antwort

1

Sie benötigen nur ein Rohr, und in der Tat verwenden Sie nur ein, auch wenn Sie zwei erstellen. Außer Sie tatsächlich erstellen vier, weil Sie die Pipes nach dem ersten fork() erstellen, so erstellen die Eltern und ersten Kindprozess jeweils zwei.

Und das scheint das Problem zu sein. Wenn Sie möchten, dass die zwei untergeordneten Prozesse über eine Pipe kommunizieren, müssen sie die gleiche Pipe verwenden. Sie würden dies tun, indem sie die offenen Dateideskriptoren für die Pipe-Enden vom Parent-Prozess erben, was erfordert, dass sie eine Pipe verwenden, die von einem Prozess erstellt wurde, von dem beide abstammen (dh der Parent-Prozess) und der erstellt wurde, bevor ein Kind gegabelt wurde . So wie es ist, macht nur das zweite Kind das; der erste benutzt eine Pfeife, die er selbst erzeugt, und die daher mit nichts anderem verbunden ist.

+0

OMG ,,, ich bin so dumm ... danke alott john –