2012-05-22 3 views
2

Вот программа, которую я пытаюсь сделать:Перенаправление 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(); 
    } 
} 

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

+0

Просьба указать, что означает «проблема», а не просто сбрасывать ваш код, чтобы мы узнали об этом. Если вы не знаете, в чем проблема, добавьте отчет об ошибках в свою программу. –

+0

Не разрешайте вашу проблему, но вы должны указать функцию int * sts для wait() (может быть NULL). –

ответ

3

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

char* arguments[] = {"cat", "superabundantes.py", NULL}; 
+0

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

Смежные вопросы