Чтение и запись из / в конвейерный stdin, стандартный вывод

#c #process #pipe #stdout #stdin

#c #процесс #конвейер #стандартный вывод #стандартный интерфейс

Вопрос:

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

У меня есть следующий код:

 int main()
{
int in,out;

popen2("./Reader/reader",amp;in,amp;out);
int result = write(in, "hello", sizeof("hello"));
char out_arr[100];

result = read(out, out_arr, sizeof("Received"));
fprintf( stderr, "%sn", out_arr);

return 0;
}
 

Где popen2 имеет следующий вид:

 #define READ 0
#define WRITE 1

pid_t
popen2(const char *command, int *infp, int *outfp)
{
int p_stdin[2], p_stdout[2];
pid_t pid;

if (pipe(p_stdin) != 0 || pipe(p_stdout) != 0)
    return -1;

pid = fork();

if (pid < 0)
    return pid;
else if (pid == 0)
{

    close(p_stdin[WRITE]);
    dup2(p_stdin[READ], READ);
    close(p_stdout[READ]);
    dup2(p_stdout[WRITE], WRITE);

    execl("/bin/bash", "bash", "-c", command, NULL);
    perror("execl");

    exit(1);
}

if (infp == NULL)
    close(p_stdin[WRITE]);
    else
    {

    *infp = p_stdin[WRITE];
    }

if (outfp == NULL)
    close(p_stdout[READ]);
else

{

    *outfp = p_stdout[READ];
}

return pid;
}
 

Это открывает дочерний процесс. Как я могу прочитать «привет», который я записываю в канал в основном процессе, из дочернего процесса? Как я могу выполнить обратную запись в основной процесс?

На данный момент это, похоже, не работает:

 int main()
{

std::string input;
while(std::cin>>input)
{
    std::cout<<"Received";
}

return 0;
}
 

Ответ №1:

РЕШАЕМАЯ

Я пропустил n r в конце отправленного массива символов, чтобы быть красным из дочернего процесса.

 int main()
{
int in,out;

popen2("./Reader/reader",amp;in,amp;out);
int result = write(in, "hellonr", sizeof("hellonr"));
char out_arr[100];

result = read(out, out_arr, sizeof("Received"));
fprintf( stderr, "%sn", out_arr);

return 0;
}