一个关于管道的问题

发布于 2022-10-15 08:22:51 字数 12771 浏览 13 评论 0

本帖最后由 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技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文