小编Opt*_*Pwn的帖子

C Minishell添加管道

所以我正在制作一个UNIX minishell,我正在尝试添加管道,所以我可以这样做:

ps aux | grep dh | grep -v grep | cut -c1-5
Run Code Online (Sandbox Code Playgroud)

但是我把头缠绕在管道部分上时遇到了麻烦.我替换所有的"|" 字符为0,然后将每一行作为法线运行.但是,我试图转移输出和输入.命令的输入需要是前一个命令的输出,命令的输出需要是下一个命令的输入.

我正在使用管道这样做,但我无法弄清楚在哪里调用pipe()以及在哪里关闭它们.从主处理函数,processline(),我有这个代码:

if((pix = findUnquotChar(line_itr, '|')))
{
    line_itr[pix++] = 0;
    if(pipe (fd) < 0) perror("pipe");
    processline(line_itr, inFD, fd[1], pl_flags);
    line_itr = &(line_itr[pix]);

    while((pix = findUnquotChar(line_itr, '|')) && pix < line_len)
    {
        line_itr[pix++] = 0;
        //? if(pipe (fd) < 0) perror("pipe");
        processline(line_itr, fd[0], fd[1] pl_flags);
        line_itr = &(line_itr[pix]);
    //? close(fd[0]);
    //? close(fd[1]);
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

所以,我是递归的(上面的代码在processline中)在"|"之间发送命令 由流程线处理.你可以看到我在上面的代码注释,我不知道如何使它工作.processline的第二个和第三个参数分别是inputFD和outputFD,所以我需要处理命令,将输出写入管道,然后在下一个命令上再次调用processline,但是这次上一个命令的输出是输入.这似乎并不像它可以工作,因为每次我关闭fd [0]我失去了以前的输出.我需要两个独立的管道,我可以来回翻转吗?

如果您需要任何其他信息,我只是想知道如何使用单个管道实现这一点.这是整个流程线功能,以备您查看:

http://pastebin.com/YiEdaYdj

编辑:如果有人有一个实现管道的shell的例子,我希望链接到源代码,到目前为止我还没能在谷歌上找到一个.

编辑2:这是我的困境的一个例子:

echo a | echo …
Run Code Online (Sandbox Code Playgroud)

c unix shell pipeline pipe

4
推荐指数
1
解决办法
5298
查看次数

C适当使用全球变量

我正在C中构建一个minishell,并且已经出现了一个障碍,似乎可以通过使用全局变量(确切地说是3)来轻松修复它.我认为全局变量是必要的原因是,替代方案是将这些变量传递给程序中的几乎每个函数.

变量是mainargc,mainargv和shiftedMArgV.前两个是参数的数量,并且参数列表分别传递给main.变量shiftMrgV是参数列表,但它可能已被移位.我正在尝试创建内置函数shift和unshift,并将shiftMrgV指向不同的参数.

那么,让这些全球变得愚蠢是不是很愚蠢?否则我将不得不修改大量的代码,而且我不确定通过使它们全局化而失去任何东西.

如果我确实将它们设为全局,那么从主头文件中这样做是愚蠢的吗?

感谢帮助人员,如果您需要任何澄清,请询问.

c shell program-entry-point arguments global-variables

2
推荐指数
1
解决办法
152
查看次数