2013-05-21 3 views
1

Я экспериментирую с этой командой dup2 в linux. Я написал код следующим образом:используя сортировку с dup2

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 

int main() 
{ 
    int pipe1_ends[2]; 
    int pipe2_ends[2]; 
    char string[] = "this \n is \n not \n sorted"; 
    char buffer[100]; 
    pid_t pid; 

    pipe(pipe1_ends); 
    pipe(pipe2_ends); 

    pid = fork(); 


    if(pid > 0) { /* parent */ 

     close(pipe1_ends[0]); 
     close(pipe2_ends[1]); 

     write(pipe1_ends[1],string,strlen(string)); 
     read(pipe2_ends[0], buffer, 100); 
     printf("%s",buffer); 
     return 0; 
    } 

    if(pid == 0) { /* child */ 
     close(pipe1_ends[1]); 
     close(pipe2_ends[0]); 
     dup2(pipe1_ends[0], 0); 
     dup2(pipe2_ends[1],1); 
     char *args[2]; 
     args[0] = "/usr/bin/sort"; 
     args[1] = NULL; 
     execv("/usr/bin/sort",args);  
    } 
    return 0; 
} 

Я ожидаю, что эта программа ведет себя следующим образом: Он должен раскошелиться ребенка и заменить его изображение с процессом сортировки. И поскольку stdin и stdout заменяются командой dup2, я ожидаю, что сортировка будет считывать входные данные из канала и записывать вывод в другой канал, который печатается родителем. Но программа сортировки, похоже, не читает никаких данных. Если аргумент командной строки не задан, сортировка читает его справа от stdin? Может ли кто-нибудь помочь мне с этой проблемой, пожалуйста.

Большое спасибо!

ответ

1

Hm. Что происходит, так это то, что вы не закончили свою запись: после отправки данных в дочерний процесс вам нужно сказать, что вы закончили писать, либо закрыв pipe1_ends [1], либо набрав на нем shutdown(2). Вы также должны вызывать запись/чтение в цикле, поскольку в общем случае вполне вероятно, что чтение, по крайней мере, не даст вам всех результатов за один раз. Очевидно, что полный код проверяет все возвращаемые значения, не так ли?

Последняя вещь: ваш printf сильно сломан. Он может принимать только строки с нулевым завершением, а результат, возвращаемый read, не будет заканчиваться на нуль (это буфер с длиной, другой общий способ узнать, где находится конец). Вы хотите:

int n = read(pipe2_ends[0], buffer, 99); 
if (n < 0) { perror("read"); exit(1); } 
buffer[n] = 0; 
printf("%s",buffer); 
+0

Это сделало. благодаря – user2290802

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