2016-03-28 11 views
1

Ich muss die folgenden Linux-Befehle ausführen: ls -la | sortieren | wc -l und ich habe exec-Funktionen verwenden ... Hier ist mein Code:C wie exec mit Linux-Befehlen und Pipes zu verwenden

x = fork(); 

char * args[] = { "ls", "-la" , "|", "sort" , "|" , "wc", "-l" }; 

if(x == 0){ //Father  
//Dad validations 


}else{  

    execlp(args[0],args[0], args[1],args[2],args[3],args[4],args[5],args[6], NULL); 
    perror("Exec error\n"); 

    exit(1); 
} 

Die Befehle richtig getrennt arbeiten, aber wenn ich sie mir diese Fehlermeldung zusammen:

ls: cannot access |: No such file or directory 

    ls: cannot access sort: No such file or directory 

Ich schätze, der Fehler ist in der Linux-Rohr

Vielen Dank für Ihre Zeit!

+0

'exec (lp)' erwartet keine Shell-Syntax, es erwartet einen Prozessnamen und seine Argumente. –

+0

aber Sie können immer noch exec mit Linux-Befehlen verwenden ... und das ist was ich wat – Joseph

Antwort

2

Versuchen Sie, die folgenden args Ausführung statt:

char * args[] = { "bash", "-c" , "ls -la | sort | wc -l" }; 

Dies ist notwendig, da das Rohr Syntax Sie (und die resultierende Leitung der Ausgabe von einem Prozess zu einem anderen) verwenden mögen eigentlich ein Merkmal der Schale ist. Um also einen auf diese Weise formatierten Befehl execlp zu können, müssen wir eine Shell (bash in diesem Fall) ausführen und Ihren Befehl als String mit dem -c-Flag angeben.

+0

@sjl Vielleicht erklären Sie Joseph, warum Sie denken, dass dies sein Problem beheben wird (und dass er vielleicht die Anzahl der an execlp übergebenen Argumente ändern muss) –

+0

@slj mein Fehler ... es hat 100% funktioniert, danke! Ich musste nur meinen Code – Joseph

+0

reajust bitte entfernen Sie die Abstimmung unten auf sjl, es funktionierte – Joseph