Мультипрограммирование в Unix - PullRequest
0 голосов
/ 12 августа 2010

У меня есть некоторые проблемы при попытке сделать простую программу, используя execlp, fork и pipe Предполагается, что программа под рукой «last | head -5 | sort» не работает. Вот код.

#include <string.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>

//last |head -5| sort
int main(int argc, char* argv[]){

 int buzon[2];
 int buzon2[2];

 if(pipe(buzon) < 0)
  error("error de pipe");

 switch(fork()){

  case -1:
   error("error de fork");

  case 0:
   if(close(1) < 0) error("error de close");
   if(dup(buzon[1]) < 0) error("error de dup");
   if(close(buzon[0]) < 0) error("error de close");
   if(close(buzon[1]) < 0) error("error de close");
   execlp("last", "last", NULL);
   error("error de execlp");

 }



 switch(fork()){

  case -1:
   error("error de fork");

  case 0:
   if(close(0) < 0) error("error de close");
   if(close(1) < 0) error("error de close");
   if(dup(buzon[0]) < 0) error("error de dup");
   if(dup(buzon[1]) < 0) error("error de dup");
   if(close(buzon[0]) < 0) error("error de close");
   if(close(buzon[1]) < 0) error("error de close");
   execlp("head", "head", "-n 5", NULL);
   error("error de execlp");


 }


 switch(fork()){
  case -1: 
   error("error de fork");
  case 0:
   if(close(0)<0) error("error de close");
   if(dup(buzon[0]) != 1) error("error de dup");
   if(close(buzon[0]) < 0) error("error de close");
   if(close(buzon[1]) < 0) error("error de close");
   execlp("sort", "sort", NULL);
   error("error de execlp");
 }


 if(close(buzon[0]) < 0) error("error de close");
 if(close(buzon[1]) < 0) error("error de close");
 while(wait(NULL) != -1);





}

Любая идея о том, что терпит неудачу. Проблема в том, когда я использую 2 трубы. Если я создаю программу, которая использует только 1 канал, она работает.

1 Ответ

0 голосов
/ 12 августа 2010

Вам необходимо создать второй канал, а затем использовать его для стандартного вывода процесса head и стандартного ввода процесса sort. В точке вашего второго fork():

 close(buzon[1]);
 pipe(buzon2);

 /* Now buzon[0], buzon2[0] and buzon2[1] are still open in this process */

 switch(fork()){

  case -1:
   error("error de fork");

  case 0:
   if(close(0) < 0) error("error de close");
   if(close(1) < 0) error("error de close");
   if(dup(buzon[0]) < 0) error("error de dup");
   if(dup(buzon2[1]) < 0) error("error de dup");
   if(close(buzon[0]) < 0) error("error de close");
   if(close(buzon2[0]) < 0) error("error de close");
   if(close(buzon2[1]) < 0) error("error de close");
   execlp("head", "head", "-n 5", NULL);
   error("error de execlp");
   exit(1);
 }

 close(buzon[0]);
 close(buzon2[1]);
 /* Now buzon2[0] is still open in this process */

 switch(fork()){
  case -1: 
   error("error de fork");
  case 0:
   if(close(0)<0) error("error de close");
   if(dup(buzon2[0]) < 0) error("error de dup");
   if(close(buzon2[0]) < 0) error("error de close");
   execlp("sort", "sort", NULL);
   error("error de execlp");
   exit(1);
 }

 close(buzon2[0]);

(Вы также должны exit() дочерний процесс после ошибки execlp())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...