遵循此问题问答
Connecting n commands with pipes in a shell?
我尝试执行yes | head
,但它在无限循环中运行,或者它从不响应。有什么问题。
我确实做了一些更改,这是正在运行的代码
#include <unistd.h>
struct command
{
const char **string;
};
助手功能
pid_t start(command* command, pid_t pid, int* status, int in, int out) {
(void) pid;
pid_t cpid;
int childInt;
cpid = fork();
if (cpid == 0) {
if (in != 0)
{
dup2(in, 0);
close(in);
}
if (out != 1)
{
dup2(out, 1);
close(out);
}
execvp(c->string[0], c->string);
_exit(1);
}
waitpid(cpid, &childInt, 0);
}
*status = childInt;
return c->pid;
}
以及我的主要功能
for(int i = 0; i < n; i++)
//New command every loop
int p = pipe(fd);
if (p == 0)
{
start_command(c, 0, &status, in, fd[1]);
close(fd[1]);
in = fd[0];
}
continue;
}
dup2(in, 0);
答案 0 :(得分:4)
如果要执行yes | head
,则需要创建两个进程yes
和head
,并且需要将它们与管道连接。您没有执行此操作的代码,只需执行yes
并将其传递给| head
。这导致yes
不断地输出"| head"
。
您不能仅将yes
和| head
传递给execvp
。您可以execvp
一个shell并将其yes | head
传递给它,因为shell具有创建管道,生成多个进程并将其正确连接的必要代码。