日期:2014-05-16  浏览次数:20729 次

linux下管道程序求解
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#define MAX_CMD_LEN 100

int main()
{
  pid_t child_b,child_c;
  int pipefds[2];
  int i,j;
  char *pipe_front,*pipe_behind,*guodu;
  char command[MAX_CMD_LEN];
  char *arg1[]={"/usr/bin/wc",NULL};
  char *arg2[]={"/bin/cat","new_pipe.c",NULL};
  char cmd1[MAX_CMD_LEN],cmd2[MAX_CMD_LEN];
  
  //while(1){
  printf("please Enter command>");
  fgets(command,MAX_CMD_LEN,stdin);
  command[strlen(command)-1]=0;
  
  guodu=command;
  pipe_front=strsep(&guodu,"|");
  pipe_behind=guodu;
  
  for(i=0;i<strlen(pipe_front);i++)
  cmd1[i]=*pipe_front++;
  
  for(j=0;j<(pipe_behind);j++)
  cmd2[j]=*pipe_behind++;  
 // printf("pipe_front=%s\n",pipe_front);
 // printf("pipe_behind=%s\n",pipe_behind);

  pipe(pipefds);
  if(!(child_b=fork()))
  {
  close(pipefds[1]);
  close(0);
  dup2(pipefds[0],0);
  close(pipefds[0]);
  execlp(cmd2,cmd2,NULL);
  // execve("/usr/bin/wc",arg1,NULL);
  }
  close(pipefds[0]);

  if(!(child_c=fork()))
  {
  close(1);
  dup2(pipefds[1],1);
  close(pipefds[1]);
  execlp(cmd1,cmd1,NULL);
  // execve("/bin/cat",arg2,NULL);
  // execlp(command,command,NULL);  
  }
   
  close(pipefds[1]);
  wait4(child_b,NULL,0,NULL);
  return 0;
}
如果用execve的话就能正常运行,但只能固定,用execlp的话就根本不能统计出来,都是0,用ls |wc,不知道如何解,目前这个能运行但会出现段错误,求解!

------解决方案--------------------
咱也看看 int execlp(const char *file, const char *arg, ...); 的函数原型再用吧, 你传的是argv数组,人家要求传去变参。