一个关于管道的问题
本帖最后由 lansunlong 于 2011-04-28 13:08 编辑
一个简单的C写的shell程序,用管道实现输入的命令,测试命令为 /bin/ls -l / | /bin/more ,但是结果输出不是期望的输出,
代码如下,即附件中的内容,请大家帮忙找找问题哦
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#define MAX_HISTORY 12
#define MAXBUF 100
//管道初始化宏定义
#define NO_PIPE -1//标识管道关闭
#define NO_READ 0//标识管道端为读端
#define NO_WRITE 1//标识管道端为写端
int status;
//--文件描述符
int fd[10][2];
//管道命令处理函数
int pipel(char *input, int input_len)
{
char *pargtem[10][4];
char buf[MAXBUF];
strcpy(buf,input);
input_len ++;
char *input1 = (char *)malloc(sizeof(char)*(input_len));
buf[input_len-1] = ' ';
strcpy(input1, buf);
int i=0;
//初始化文件描述符
for(i=0; i<10;i++)
{
fd[NO_READ] = NO_PIPE;
fd[NO_WRITE] = NO_PIPE;
}
//解析命令
// int j=1;
int m=0;//标识管道中的新命令
int j=0;//标识管道命令计数
int k=0;//标识命令参数计数
for(i=0; i<input_len; i++)
{
if(input1 == '\0' || input1 == ' ')
{
if(m == 0)
continue;
else
{
buf[m++] = '\0';
pargtem[j][k] = (char *)malloc(sizeof(char)*m);
strcpy(pargtem[j][k++], buf);
m=0;
}
}
else if(input1 == '|')
{
if(m == 0)
{
pargtem[j][k] = NULL;
j++;k=0;
}
else
{
buf[m++] = '\0';
pargtem[j][k] = (char *)malloc(sizeof(char)*m);
strcpy(pargtem[j][k++], buf);
pargtem[j][k] = NULL;
m=0;j++;k=0;
}
}
else
buf[m++] = input1;
}
free(input1);
int li_cmd = j;//解析命令完成,解析完成后的命令存储在二维数组pargtem中,命令个数为li_cmd
//建立管道
for(i = 0; i<=li_cmd; i++)
{
if(pipe(fd) == -1)
{
printf("Can not open pipe!\n");
return 0;
}
}
//初始化程序的输入输出端到管道的读写端
int pid[100];
for(i=0; i< li_cmd; i++)
{
if( i == 0)
{
if((pid[0] = fork()) < 0)
{
perror("Fork failed");
exit(errno);
}
if(!pid[0])
{
dup2(fd[0][1], 1);
close(fd[0][0]);
close(fd[0][1]);
if(execvp(pargtem[0][0], pargtem[0]) == -1)
{
perror("Execvp failed");
exit(errno);
}
}
else
{
close(fd[0][0]);
close(fd[0][1]);
}
}
else
{
if((pid = fork()) < 0)
{
perror("Fork failed");
exit(errno);
}
if(!pid)
{
dup2(fd[1], fd[i-1][0]);
close(fd[0]);
close(fd[1]);
if(execvp(pargtem[0], pargtem) == -1)
{
perror("Execvp failed");
exit(errno);
}
}
else
{
close(fd[0]);
close(fd[1]);
}
}
}
dup2(fd[li_cmd][0], 0);
close(fd[li_cmd][1]);
close(fd[li_cmd][0]);
if(execvp(pargtem[0], pargtem) == -1)
{
perror("Execvp failed");
exit(errno);
}
printf("End\n");
return 0;
}
int main()
{
char *input = "/bin/ls -l / | /bin/more";
int input_len;
input_len = strlen(input);
pipel(input, input_len);
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论