首先,我已经看到了所有的职位之前。我已经从这里的代码https://stackoverflow.com/a/8439286/14888108
我有一个问题不知如何解决:当我做fork时,无论如何pid都不是0。它是一个随机数,开始像:4013,4014如果我给予[输入:回声atb| grep“B”]
下面是我的代码:
代码错误后编辑相同问题:
void Pipeline(char *input) {
int numPipes = 2 * countPipes(input);
int k = commends(input);
int j = 0;
for (int i = 0; i < k; i++) {
int pid = fork();
if (pid == 0) {
if (i != k-1) {
if (dup2(pipefds[j + 1], 1) < 0) {
perror("dup2");
exit(EXIT_FAILURE);
}
}
//if not first command&& j!= 2*numPipes
if (j != 2*numPipes && i != 0) {
if (dup2(pipefds[j - 2], 0) < 0) {
perror(" dup2");
exit(EXIT_FAILURE);
}
}
for (i = 0; i < 2 * numPipes; i++) {
close(pipefds[i]);
}
if (execvp(vec[i], vec) < 0) {
perror(vec[i]);
exit(EXIT_FAILURE);
}
} else if (pid < 0) {
prev++;
perror("error");
exit(EXIT_FAILURE);
}
j += 2;
}
for (int i = 0; i < 2 * numPipes; i++) {
close(pipefds[i]);
}
for (int i = 0; i < numPipes + 1; i++) {
wait(NULL);
}
printf("DONE!\n");
}
1条答案
按热度按时间lf5gs5x21#
这些行:
似乎没有太大的意义,如果你先把
pid
复制到prev
,那么pid
怎么可能等于prev + 1
呢?另外,你似乎期望一个特定的进程id:s序列,这不是很可能或可移植的(甚至不是很好)。其他进程忙碌在后台创建和销毁进程,我不认为你可以假设你的特定进程有一个私有的pid空间要填充。