考虑一个新的运算符'|||'。它将采用前一个程序的输出和 将其作为输入传递给三个不同的程序。给一个程序triplepipe.c for 执行以下命令:ls -l | uniq ||| grep ^ d,grep ^ - ,grep ^ P。不要使用popen()库调用,system()库调用或临时文件。
我使用以下逻辑来解决问题的第一部分。 ' ls -l'在child1中完成,' uniq'在child2中使用child1的stdout作为stdin和' grep ^ d'在父母中使用child2的标准输出作为标准输入。我能看到输出。
但我不知道如何将child2的输出提供给满足设置限制的三个单独的grep。有人可以帮忙吗?
答案 0 :(得分:4)
这项任务的一部分基本上是实现3路tee
。设置管道和子进程后,您必须输入一次读取并写入3次的循环,直到读取命中EOF。
在Linux中,还有一个tee
系统调用,它不在您的禁止列表中。这对于这个项目来说是完美的,但它相当新,所以你的老师很有可能还不知道它。
答案 1 :(得分:0)
引用"管道只是文件"
认为你是dup2&ed;目前将你的数据放在其中一个孩子的管道中。现在只需从管道中读取并使用Write System调用并写入3个不同的管道。
从那里你可以在3个不同的过程中以不同的方式处理数据
认为这就是你所需要的;)
答案 2 :(得分:0)
附上我的问题的答案。
void main() {
int p1[2]; // pipe between ls | uniq and grep
int p2[2]; // pipt between ls and uniq
int p3[2]; // pipt between ls and uniq
int p4[2]; // pipt between ls and uniq
int p5[2]; // pipt between ls and uniq
char buff[200];
char data[10 * 1024];
int count;
int teelen;
pid_t ret;
pid_t chd;
pipe (p1);
ret = fork();
if (ret == 0) {
pipe (p2);
chd = fork();
if (chd == 0) {
close (1); // close stdout
dup (p2[1]); // dup stdout to p2's out
close (p2[0]); // close p2's in
execlp ("ls", "ls", "-l", NULL); // execute command
exit (0);
}
if (chd > 0) {
close (0); // close stdin
dup (p2[0]); // dup stdin to p2's in
close (p2[1]); // close p2's out
wait(NULL); // wait for child to finish
close (1); // close stdout
dup (p1[1]); // dup stdout to p1's out
close (p1[0]); // close p1's in
execlp ("uniq", "uniq", NULL); // command
exit (0);
}
}
if (ret > 0) {
close (0); // close stdin
dup (p1[0]); // dup stdin to p1's in
close(p1[1]);
wait(NULL); // wait for child to complete
memset (data, '\0', sizeof(data));
do {
memset(buff, '\0', sizeof(buff));
count = read(p1[0], buff, 199);
buff[count] = '\0';
if (count == 0)
break;
strcat (data, buff);
} while(1);
pipe (p3);
close(p1[0]);
write (p3[1], data, sizeof (data));
fsync(p3[1]);
if (fork() == 0) {
int c;
close(0);
dup(p3[0]);
close(p3[1]);
execlp ("grep", "grep", "-a", "^d", NULL);
exit (0);
}
close(p3[1]);
wait(NULL);
pipe (p4);
write (p4[1], data, sizeof (data));
if (fork() == 0) {
close(0);
dup(p4[0]);
close(p4[1]);
execlp ("grep", "grep", "-a", "^-", NULL);
exit (0);
}
close(p4[1]);
wait(NULL);
pipe (p5);
write (p5[1], data, sizeof (data));
if (fork() == 0) {
close(0);
dup(p5[0]);
close(p5[1]);
execlp ("grep", "grep", "-a", "^c", NULL);
exit (0);
}
close(p5[1]);
wait(NULL);
}
}