Проблема с трубой и вилкой, выход в отсортированном порядке - PullRequest
2 голосов
/ 01 марта 2020

У меня есть программа, которая должна создать дочерний процесс и выполнить команду ls. Выходные данные этой команды должны передаваться в родительский процесс, где она выводится на экран.

Проблема заключается в том, что родительский процесс получает выходные данные дочернего процесса в отсортированном порядке. После 2 дней работы над ним я все еще не понимаю, зачем он это делает.

Это мой код:

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

int main(){
    int Pipe1[2];
    int pid, numread;
    char buf;

    pipe(Pipe1);
    pid = fork();

    if(pid == 0){
        close(Pipe1[0]);
        dup2(Pipe1[1], STDOUT_FILENO);
        close(Pipe1[1]);

        execl("/bin/ls", "ls", NULL);
    }
    else{
        close(Pipe1[1]);
        dup2(Pipe1[0], STDIN_FILENO);
        close(Pipe1[0]);

        while(1){
            numread = read(STDIN_FILENO, &buf, 1);
            if(numread > 0)
                fprintf(stderr, "%c", buf);
            else break;
        }

        close(STDOUT_FILENO);
        wait(NULL);
    }
}

Это ожидаемый результат:

a.out    tk-quiz-01-ptr-trace.pdf     tk-quiz-02c-prog-image-static.pdf  tk-quiz-04-cpu-schedule.pdf
quiz7.c  tk-quiz-02b-cl-allocate.pdf  tk-quiz-03-unix-process.pdf        tk-quiz-05-cpu-sch-link-list.pdf

Это фактический результат:

a.out
quiz7.c
tk-quiz-01-ptr-trace.pdf
tk-quiz-02b-cl-allocate.pdf
tk-quiz-02c-prog-image-static.pdf
tk-quiz-03-unix-process.pdf
tk-quiz-04-cpu-schedule.pdf
tk-quiz-05-cpu-sch-link-list.pdf
...