Почему мой второй дочерний процесс запускается раньше, чем мой первый? - PullRequest
0 голосов
/ 18 октября 2018

В настоящее время я пытаюсь написать небольшую оболочку, которая поддерживает трубопровод.В моей функции execute(char** args, char** args2) требуется два массива символов, где каждая команда разделяется разделителем " ".Первый аргумент содержит команды перед конвейером (например, {ls, -l}, а второй аргумент - команды после конвейера (например, {wc}).

Однако в моей функции execute второй дочерний процесс pid2 запускается первым, а первый дочерний элемент pid1 никогда не попадает.

Я не уверен, что мне не хватает чего-то важного для создания ваших собственных конвейерных команд в C, и я действительно буду признателен за любую помощь / советЯ мог бы получить.

Выполнить функцию:

int execute(char** args, char** args2) {
    int des_p[2];
    pid_t pid1, pid2; 
    if(pipe(des_p) == -1) {
        perror("Pipe failed");
        exit(1);
    }
    pid1 = fork();
    if(pid1 == 0) {
        printf("AT FIRST CHILD");
        dup2(des_p[1], STDOUT_FILENO);
        close(des_p[0]);
        execvp(args[0], args);
        perror("execvp of of FIRST PROCESS failed");
        exit(1);
    }
    pid2 = fork();
    if(pid2 == 0) {
        printf("AT SECOND CHILD \n");
        dup2(des_p[0], STDIN_FILENO);
        close(des_p[1]);
        execvp(args2[0], args2);
        perror("execvp of SECOND PROCESS failed");
        exit(1);
    }
    close(des_p[0]);
    close(des_p[1]);
    wait(pid1);
    wait(pid2);

    return 0;
}

1 Ответ

0 голосов
/ 18 октября 2018

Первый дочерний элемент запущен, но вы не видите сообщение из-за буферизации stdio.По умолчанию stdout буферизуется строкой, поэтому буфер не очищается до тех пор, пока вы не напечатаете новую строку.Вы печатаете сообщение без новой строки, а затем вызываете execvp() перед тем, как очистить буфер, поэтому буфер никогда не очищается и сообщение никогда не просматривается.

Измените его на:

    printf("AT FIRST CHILD\n");
...