Выход execlp () не может быть перенаправлен на стандартный вывод с конвейером

0

У меня есть следующая программа:

#include<iostream>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>

using namespace std;

int main()
{
  int p[2];
  int code;
  pid_t pid;
  if(-1==(pipe(p)))
  {
    cout<<"Pipe error!"<<endl;
    return 1;
  }
  if(-1==(pid=fork()))
  {
    cout<<"Fork error!"<<endl;
    return 1;
  }
  if(pid==0)
  {
     dup2(p[1],1);//duplicates stdout?
     close(p[0]);//closes reading end
     execlp("grep","grep","/bin/bash","/etc/passwd",NULL);
     return 1;
  }
  else
  {
    cout<<"works so far"<<endl;
    wait(&code);
    cout<<"Doesn't get here"<<endl;
    //how do i read from the pipe to print on the screen what execlp wanted to ?
  }
return 1;
}

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

Из того, что я понимаю до сих пор, когда я делаю dup2 (p [1], 1), он дублирует stdout и закрывает его. Так что execlp будет писать в дескриптор наименьшего значения (это моя труба, поскольку она закрыта и скопирована stdout). Где я не прав?

ps Я компилирую с g++

Теги:
exec
fork
parent-child

1 ответ

0
Лучший ответ

Мне удалось решить эту проблему путем дублирования stdout к файлу (дескриптору), затем в родительском процессе я открываю и читаю вывод execlp из него.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню