Перенаправление stdout в канал в C

Вот программа, которую я пытаюсь сделать:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>



int main(int argc, char* argv[])
{
    char* arguments[] = {"superabundantes.py", NULL};

    int my_pipe[2];
    if(pipe(my_pipe) == -1)
    {
        fprintf(stderr, "Error creating pipe\n");
    }

    pid_t child_id;
    child_id = fork();
    if(child_id == -1)
    {
        fprintf(stderr, "Fork error\n");
    }
    if(child_id == 0) // child process
    {
        close(my_pipe[0]); // child doesn't read
        dup2(my_pipe[1], 1); // redirect stdout

        execvp("cat", arguments);

        fprintf(stderr, "Exec failed\n");
    }
    else
    {
        close(my_pipe[1]); // parent doesn't write

        char reading_buf[1];
        while(read(my_pipe[0], reading_buf, 1) > 0)
        {
            write(1, reading_buf, 1); // 1 -> stdout
        }
        close(my_pipe[0]);
        wait();
    }
}

Я хочу выполнить exec в дочернем элементе, перенаправляя стандартный вывод дочернего элемента к родителю (через канал). Я думаю, что проблема может быть связана с dup2, но я не использовал его раньше.


person XavierusWolf    schedule 22.05.2012    source источник
comment
Пожалуйста, укажите, в чем проблема, вместо того, чтобы просто сбросить свой код, чтобы мы могли это выяснить. Если вы не знаете, в чем проблема, добавьте в свою программу сообщения об ошибках.   -  person Fred Foo    schedule 22.05.2012
comment
Не решайте свою проблему, но вы должны указать int *sts для функции ожидания () (может быть NULL).   -  person André A. G. Scotá    schedule 22.05.2012
comment
Спасибо за это! отлично работает после изменения char* arguments[] = {cat', superabundantes.py, NULL};   -  person user1932637    schedule 22.08.2019


Ответы (2)


Вам нужно также предоставить argv[0] при вызове exec. Итак, ваши аргументы должны звучать так:

char* arguments[] = {"cat", "superabundantes.py", NULL};
person kmkaplan    schedule 22.05.2012
comment
Да! Ты прав. char* arguments[] = {cat, superabundantes.py, NULL}; execvp(argv[0], аргументы); Это работает отлично, спасибо. - person XavierusWolf; 22.05.2012

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>



int main(int argc, char* argv[])
{
    //char* arguments[] = {"cat","tricky.txt", NULL};
    char* arguments[] = {"./son1", NULL};
    int my_pipe[2];
    if(pipe(my_pipe) == -1)
    {
       fprintf(stderr, "Error creating pipe\n");
    }

    pid_t child_id;
    child_id = fork();
    if(child_id == -1)
    {
        fprintf(stderr, "Fork error\n");
    }
    if(child_id == 0) // child process
    {
        close(my_pipe[0]); // child doesn't read
        dup2(my_pipe[1], 1); // redirect stdout

        execvp(arguments[0], arguments);

        fprintf(stderr, "Exec failed\n");
    }
    else
    {
        close(my_pipe[1]); // parent doesn't write

        char reading_buf[1];

        while(read(my_pipe[0], reading_buf, 1) > 0)
        {
           write(1, reading_buf, 1); // 1 -> stdout
        }

        close(my_pipe[0]);
        wait();
   }

}

/* если ./son1 возвращает printf() в son1, будет выведено write(1 ..) в родительском, если son1 находится в мертвом цикле, то printf() в son1 НЕ будет выведено write(1 ..) в родительском

void main()
{
    printf( "***** son run *****\n\r" );
    return;
    while(1);
}

есть идеи?
*/

person user1932637    schedule 21.08.2019