2016-05-12 9 views
0

Ich möchte die Ausgabe von einem Bash-Skript (sc.sh), die im selben Verzeichnis wie dieses Programm ist und die Zeile darunter enthält, auf die Eingabe eines C-Programms (cprog) ; cprog Arbeiten ausführen, aber ich weiß nicht, warum der Bash-Skript startet nicht:Fork Exec und Pipe mit Bash-Skript

timeout 5 cat /dev/urandom 

und das ist das Hauptprogramm:

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

int main(int argc, char* argv[]) 
{ 
    int fd[2]; 
    pid_t pid1, pid2; 
    char * input[] = {"/bin/bash", "sc.sh", argv[1], NULL}; 
    char * output[] = {"./cprog", argv[1], NULL}; 

    pipe(fd); 

    pid1 = fork(); 
    if (pid1 == 0) { 
     dup2(fd[1], STDOUT_FILENO); 
     close(fd[0]); 
     execv(input[0], input); 
     return 1; 
    } 

    pid2 = fork(); 
    if (pid2 == 0) { 
     dup2(fd[0], STDIN_FILENO); 
     close(fd[1]); 
     execv(output[0], output); 
     return 1; 
    } 

    close(fd[0]); 
    close(fd[1]); 
    waitpid(pid1, NULL, WNOHANG); 
    waitpid(pid2, NULL, WNOHANG); 
    return 0; 
} 
+2

Szymon, sollten Sie die Verwendung von Einzug in Betracht ziehen. :) – ZbyszekKr

+1

Sie sollten die Rückgabewerte Ihrer Funktionsaufrufe überprüfen. –

+1

Sie brauchen 'bash -c'. – EOF

Antwort

1

ich Ihr Programm geändert Fehler melden und eigentlich für die Kinder warten zu sterben, etwa so:

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

int main(int argc, char* argv[]) 
{ 
    if (argc > 2) 
     fprintf(stderr, "Excess arguments ignored\n"); 
    int fd[2]; 
    pid_t pid1, pid2; 
    char * input[] = {"/bin/bash", "sc.sh", argv[1], NULL}; 
    char * output[] = {"./cprog", argv[1], NULL}; 

    pipe(fd); 

    pid1 = fork(); 
    if (pid1 == 0) { 
     dup2(fd[1], STDOUT_FILENO); 
     close(fd[0]); 
     close(fd[1]); 
     execv(input[0], input); 
     perror(input[0]); 
     return 1; 
    } 

    pid2 = fork(); 
    if (pid2 == 0) { 
     dup2(fd[0], STDIN_FILENO); 
     close(fd[0]); 
     close(fd[1]); 
     execv(output[0], output); 
     perror(output[0]); 
     return 1; 
    } 

    close(fd[0]); 
    close(fd[1]); 
    int status1; 
    int corpse1 = waitpid(pid1, &status1, 0); 
    printf("PID %d: %d (0x%.4X)\n", pid1, corpse1, status1); 
    int status2; 
    int corpse2 = waitpid(pid2, &status2, 0); 
    printf("PID %d: %d (0x%.4X)\n", pid2, corpse2, status2); 
    return 0; 
} 

ich ein einfaches C-Programm als cprog verwendet:

#include <stdio.h> 

int main(void) 
{ 
    int c; 
    unsigned sum = 0; 
    unsigned cnt = 0; 
    while ((c = getchar()) != EOF) 
     sum += c, cnt++; 
    printf("sum of bytes: %u\n", sum); 
    printf("num of bytes: %u\n", cnt); 
    return 0; 
} 

Testing auf der Kommandozeile ergab:

$ bash sc.sh | cprog 
sum of bytes: 325895667 
num of bytes: 69926912 
$ 

das Hauptprogramm Laufen (es wurde p19 von p19.c erstellt) ergab:

$ ./p19 
sum of bytes: 372818733 
num of bytes: 70303744 
PID 28575: 28575 (0x7C00) 
PID 28576: 28576 (0x0000) 
$ 

Der Exit-Status zeigt, dass die timeout mit Status verlassen 124, was GNU als Exit-Status dokumentiert, wenn der Befehl abläuft.

Also, in meiner Reproduktion Ihrer Umgebung funktioniert der Code, den Sie zur Verfügung gestellt, OK. Das deutet darauf hin, dass deine Umgebung nicht so aufgebaut ist, wie du denkst. Vielleicht ist das sc.sh Skript nicht da.

+0

Danke, ich habe es geschafft, das Problem zu beheben, indem ich diese Dateideskriptoren schließe und auch das cprog neu schreibe. Dein Code war sehr hilfreich. – Szymon

Verwandte Themen