所以我正在制作一个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]我失去了以前的输出.我需要两个独立的管道,我可以来回翻转吗?
如果您需要任何其他信息,我只是想知道如何使用单个管道实现这一点.这是整个流程线功能,以备您查看:
编辑:如果有人有一个实现管道的shell的例子,我希望链接到源代码,到目前为止我还没能在谷歌上找到一个.
编辑2:这是我的困境的一个例子:
echo a | echo …Run Code Online (Sandbox Code Playgroud) 我正在C中构建一个minishell,并且已经出现了一个障碍,似乎可以通过使用全局变量(确切地说是3)来轻松修复它.我认为全局变量是必要的原因是,替代方案是将这些变量传递给程序中的几乎每个函数.
变量是mainargc,mainargv和shiftedMArgV.前两个是参数的数量,并且参数列表分别传递给main.变量shiftMrgV是参数列表,但它可能已被移位.我正在尝试创建内置函数shift和unshift,并将shiftMrgV指向不同的参数.
那么,让这些全球变得愚蠢是不是很愚蠢?否则我将不得不修改大量的代码,而且我不确定通过使它们全局化而失去任何东西.
如果我确实将它们设为全局,那么从主头文件中这样做是愚蠢的吗?
感谢帮助人员,如果您需要任何澄清,请询问.