//=============================================================================================
//文 件 名: my_pipe.c
//功能描述: 实现管道的建立
//维护记录: 2009-4-2 v1.0 by aohua
//=============================================================================================
#include"mysh.h"
int fd[2];
char *cmd1_buf[20]={NULL},*cmd2_buf[20]={NULL};
//=============================================================================================
//语法格式: first_cmd_fun(char *cmd1_buf[])
//功能描述: 实现对管道中第一命令的解析
//参 数: cmd1_buf[] :指向第一个命令的字符串指针
//返 回 值: 无
//=============================================================================================
void first_cmd_fun(char *cmd1_buf[])
{
close(fd[0]); //关闭子进程中的的输入句柄
close(STDOUT); //关闭标准输出
dup2(fd[1],STDOUT); //将标准输出重定向为管道的输入
execvp(cmd1_buf[0],cmd1_buf); //执行第一个命令
exit(0);
}
//=============================================================================================
//语法格式: other_cmd_fun(char *cmd2_buf[])
//功能描述: 实现对管道中第二命令的解析
//参 数: cmd2_buf[] :指向第二个命令的字符串指针
//返 回 值: 无
//=============================================================================================
void other_cmd_fun(char *cmd2_buf[])
{
close(STDIN); //关闭父进程中的的输入句柄
dup2(fd[0],STDIN); //关闭标准输入
close(fd[1]); //将标准输入重定向为管道的输出
execvp(cmd2_buf[0],cmd2_buf); //执行第二个命令
}
//=============================================================================================
//语法格式: my_pipe(char *input,int len)
//功能描述: 实现对管道的解析
//参 数: input:输入的命令 len:命令的长度
//返 回 值: 0
//=============================================================================================
int my_pipe(char *input,int len)
{
int i=0,j=0,k=0,t=0,pipe_num=0,cmd2_num;
int flag1,flag2;
int pid;
char *token;
char *cmd_buf[40]={NULL};
for(i=0;i<len;i++)
{
if(input[i]=='|')
{
pipe_num++; //记录管道的数目
}
}
token=strtok(input,"|"); //用'|'分割管道两边的命令
cmd_buf[j]=token; //得到第一个命令
while(token!=NULL)
{
token=strtok(NULL,"| ");
cmd_buf[++j]=token; //得到管道另一边的命令
}
cmd2_num=j-1; //得到第二个命令的首地址
token=strtok(cmd_buf[0]," "); //分割第一个命令中的命令和参数
cmd1_buf[k]=token;
while(token!=NULL)
{
token=strtok(NULL," ");
cmd1_buf[++k]=token;
}
token=strtok(cmd_buf[cmd2_num]," "); //分割第二个命令中的命令和参数
cmd2_buf[t]=token;
while(token!=NULL)
{
token=strtok(NULL," ");
cmd2_buf[++t]=token;
}
flag1=is_founded(cmd1_buf[0]); //判断命令1是否可执行
flag2=is_founded(cmd2_buf[0]); //判断命令2是否可执行
if(flag1==0||flag2==0)
{
printf("command not found!\n"); //若有一个不可执行提示错误信息
exit(1);
}
pipe(fd); //若都可执行创建管道
if((pid=fork())<0) //创建进进程
{
perror("fork error!\n");
exit(0);
}
if(pid==0) //进入子进程
{
first_cmd_fun(cmd1_buf); //执行命令1
}
else
{
waitpid(pid,NULL,0); //等待子进程结束
other_cmd_fun(cmd2_buf); //执行命令2
}
return 0;
}
- 1
- 2
- 3
- 4
前往页