Unix中的多道程序设计

Unix中的多道程序设计,unix,Unix,我在尝试使用execlp、fork和pipes编写一个简单的程序时遇到了一些问题。 手头的程序有权执行“last | head-5 | sort”,但它不起作用。这是代码 #include <string.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> //las

我在尝试使用execlp、fork和pipes编写一个简单的程序时遇到了一些问题。 手头的程序有权执行“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);





}
#包括
#包括
#包括
#包括
#包括
#包括
//最后|头-5 |排序
int main(int argc,char*argv[]){
国际布松[2];
int buzon2[2];
if(管道(布松)<0)
错误(“管道错误”);
开关(fork()){
案例1:
错误(“fork错误”);
案例0:
如果(关闭(1)<0)错误(“关闭错误”);
如果(dup(buzon[1])<0)错误(“重复数据消除错误”);
如果(关闭(buzon[0])<0)错误(“错误取消关闭”);
如果(关闭(buzon[1])<0)错误(“错误取消关闭”);
execlp(“最后”、“最后”、空);
错误(“执行错误”);
}
开关(fork()){
案例1:
错误(“fork错误”);
案例0:
如果(关闭(0)<0)错误(“关闭错误”);
如果(关闭(1)<0)错误(“关闭错误”);
如果(dup(buzon[0])<0)错误(“重复数据消除错误”);
如果(dup(buzon[1])<0)错误(“重复数据消除错误”);
如果(关闭(buzon[0])<0)错误(“错误取消关闭”);
如果(关闭(buzon[1])<0)错误(“错误取消关闭”);
execlp(“head”、“head”、“-n5”、NULL);
错误(“执行错误”);
}
开关(fork()){
案例1:
错误(“fork错误”);
案例0:

如果(关闭(0)您需要实际创建第二个管道,则将其用于
进程的stdout和
排序
进程的stdin。在第二个
分叉()点处:

close(buzon[1]);
管道(buzon2);
/*现在buzon[0]、buzon2[0]和buzon2[1]在此过程中仍处于打开状态*/
开关(fork()){
案例1:
错误(“fork错误”);
案例0:
如果(关闭(0)<0)错误(“关闭错误”);
如果(关闭(1)<0)错误(“关闭错误”);
如果(dup(buzon[0])<0)错误(“重复数据消除错误”);
如果(dup(buzon2[1])<0)错误(“重复数据消除错误”);
如果(关闭(buzon[0])<0)错误(“错误取消关闭”);
如果(关闭(buzon2[0])<0)错误(“错误取消关闭”);
如果(关闭(buzon2[1])<0)错误(“错误取消关闭”);
execlp(“head”、“head”、“-n5”、NULL);
错误(“执行错误”);
出口(1);
}
关闭(布松[0]);
关闭(buzon2[1]);
/*现在buzon2[0]在此过程中仍处于打开状态*/
开关(fork()){
案例1:
错误(“fork错误”);
案例0:

if(close(0)您是否有错误消息或错误号?执行后,执行时会出现以下错误:Head:写入错误:无效的文件描述符。有什么想法吗?@olbrich:对我来说效果很好-可能您没有得到所有更改(您正在调用
dup()
on now
buzon2[1]
头部
路径中,而不是
buzon[1]
?)它现在工作正常,我在dup()中将buzon[1]与buzon[1]混淆了。非常感谢!
 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]);