我试图在C上编写程序,它执行控制台shell命令
猫log.txt| awk '{打印$7 }‘\\ head -10
但是第三个命令不能在两个礼物中工作。以下是我所做的
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int fd[2], status;
pipe(fd);
pid_t pid1 = fork();
if (!pid1)
{
dup2(fd[1], 1);
close(fd[0]);
close(fd[1]);
char* command[3] = {"/bin/cat", "log.txt", 0};
execvp(command[0], command);
exit(EXIT_FAILURE);
}
else if (pid1 == -1)
{
fprintf(stderr, "Can't fork, exiting...\n");
exit(EXIT_FAILURE);
}
pid_t pid2 = fork();
if (!pid2) {
dup2(fd[0], 0);
close(fd[0]);
close(fd[1]);
char* command[3] = {"awk", "{ print $7 }", 0};
execvp(command[0], command);
exit(EXIT_FAILURE);
} else if (pid2 == -1) {
fprintf(stderr, "Can't fork, exiting...\n");
exit(EXIT_FAILURE);
}
pid_t pid3 = fork();
if (!pid3) {
dup2(fd[0], 0);
close(fd[0]);
close(fd[1]);
char* command[3] = {"head", "-10", 0};
execvp(command[0], command);
exit(EXIT_FAILURE);
} else if (pid3 == -1) {
fprintf(stderr, "Can't fork, exiting...\n");
exit(EXIT_FAILURE);
}
close(fd[0]);
close(fd[1]);
waitpid(pid1, NULL, 0);
waitpid(pid2, NULL, 0);
waitpid(pid3, &status, 0);
exit(status);
return 0;
}
pid3无法执行。我试图在dup2(fd1,1)中使用pid3,但这是行不通的。pid3上应该做什么才能使其工作,以及如何使用dup2生成多于3个命令?
发布于 2013-11-27 16:10:43
你创造了一个管道。一根管子有两头。两个过程的两端都足够了。如果三个进程全部位于一个管道中,则需要两个管道。中间的过程保持在两个管道上,另外两个过程保持在剩余的末端上。
看看这幅画:
cat | awk | head
看到两个管道符号了吗?这是你需要的两根管子。
发布于 2013-11-27 16:07:49
您必须设置两个管道-一个用于连接cat
与awk
,另一个用于连接awk
与head
。
另外,不要关闭实际需要的文件描述符(比如第一个叉子中的fd[0]
!)
https://stackoverflow.com/questions/20247095
复制相似问题