2016-12-03 1 views
0

Ich bin neu in Linux und mit Rohren mit C. Ich versuche, ein Programm mit dem Befehl: ps aux | grep root | wc -l mit Rohren zu schreiben.Simulation von Linux-Befehl mit Rohren funktioniert nicht

Das Problem ist, dass mein Programm nichts im Terminal zeigt, nicht wie der ursprüngliche Befehl!

Hier ist mein Code:

#include <stdlib.h> // exit 
#include <stdio.h> // printf 
#include <unistd.h> // execlp 

int main(int argc, char *argv[]) { 

int p1[2], p2[2]; 
int f1, f2; 

if(pipe(p1) == -1) { 
    exit(1); 
} 

if(pipe(p2) == -1) { 
    exit(2); 
} 

f1 = fork(); 
if(f1 < 0) { 
    exit(1); 
} else if(f1 == 0) { 

    close(p1[1]); 
    close(0); 
    dup2(p1[0], 0); 
    close(p1[0]); 

    close(p2[0]); 
    close(1); 
    dup2(p2[1], 1); 
    close(p2[1]); 

    execlp("grep", "grep", "root", NULL); 

} else { 

    f2 = fork(); 
    if(f2 < 0) { 
     exit(2); 
    } else if(f2 == 0) { 

     close(p2[1]); 
     close(0); 
     dup2(p2[0], 0); 
     close(p2[0]); 

     execlp("wc", "wc", "-l", NULL); 

    } else { 

     close(p1[0]); 
     close(1); 
     dup2(p1[1], 1); 
     close(p1[1]); 

     execlp("ps", "ps", "aux", NULL); 

    } 

} 

} 
+0

entfernt Grüße per [Konvention] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations- be-removed-from-posts) –

Antwort

0
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/wait.h> 

int main(int argc, char *argv[]) 
{ 

    int p1[2], p2[2]; 
    int f1, f2, f3; 
    if(pipe(p1) == -1) { 
     exit(1); 
    } 
    f1 = fork(); 
    if(f1 < 0) { 
     exit(1); 
    } 
    else if(f1 == 0) { 
     dup2(p1[1], 1); 
     close(p1[0]); 
     close(p1[1]); 
     execlp("ps", "ps", "aux", NULL); 
     perror("ps"); 
     exit(1); 
    } 
    if(pipe(p2) == -1) { 
     exit(1); 
    } 
    f2 = fork(); 
    if(f2 < 0) { 
     exit(1); 
    } 
    else if(f2 == 0) { 
     dup2(p1[0], 0); 
     close(p1[0]); 
     close(p1[1]); 
     dup2(p2[1], 1); 
     close(p2[0]); 
     close(p2[1]); 
     execlp("grep", "grep", "root", NULL); 
     perror("grep"); 
     exit(1); 
    } 
    f3 = fork(); 
    if(f3 < 0) { 
     exit(1); 
    } 
    else if(f3 == 0) { 
     dup2(p2[0], 0); 
     close(p2[0]); 
     close(p2[1]); 
     close(p1[0]); 
     close(p1[1]); 
     execlp("wc", "wc", "-l", NULL); 
     perror("wc"); 
     exit(1); 
    } 
    close(p1[0]); 
    close(p1[1]); 
    close(p2[0]); 
    close(p2[1]); 
    wait(NULL); 
    wait(NULL); 
    wait(NULL); 
} 
+0

Vielen Dank Bruder :) – Stoufa

+0

Einige Kommentare, um diese Antwort zu unterstützen und zu erklären, was es gelöst hat, ist immer besser als Glatzköpfiger Code. –

+0

Er hat 3 Threads erstellt, jeder Thread hat einen Befehl ausgeführt, während ich 2 Threads erstellt habe und der 3. Befehl wird vom Haupt-Thread ausgeführt! Beachten Sie, dass execlp() den Code des Threads durch den Code des Befehls ersetzt! Vielleicht ist das das Problem meines Codes, Frieden :) – Stoufa