C语言中多流水线的实现

iswrvxsc  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(252)

首先,我已经看到了所有的职位之前。我已经从这里的代码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");
}
lf5gs5x2

lf5gs5x21#

这些行:

int pid = fork();
prev = pid;
if (pid == prev+1) {

似乎没有太大的意义,如果你先把pid复制到prev,那么pid怎么可能等于prev + 1呢?
另外,你似乎期望一个特定的进程id:s序列,这不是很可能或可移植的(甚至不是很好)。其他进程忙碌在后台创建和销毁进程,我不认为你可以假设你的特定进程有一个私有的pid空间要填充。

相关问题