C - 使用2个管道

时间:2018-01-01 21:05:52

标签: c operating-system pipe exec

我有一个分配,我必须创建C程序,它必须执行以下操作:母进程必须通过管道向子进程发送命令ps hax -o user | sort | uniq -c的结果。子进程必须获取此结果并将其写入文件users.log

这是我写的代码:

int main(int argc, char **argv)
{
    int file_number;
    pid_t pid, pid_2, pid_3, pid_4;
    int n, pd[2],fd[2], zd[2];
    char line[MAXLINE];

if ( pipe(pd) < 0 || pipe(fd) < 0 || pipe(zd) < 0)
{
    perror("cannot create pipe.");  // failure on create pipe
    exit(1);
}

if ( (pid = fork()) < 0)
{
    perror("cannot fork");   // failure on creating child proccess
    exit(1);
}
else if ( pid > 0)  // mother proccess
{
    dup2(zd[1], STDOUT_FILENO);
    close(zd[0]);
    close(zd[1]);
    if ( (pid_4 = fork()) < 0)
    {
        perror("cannot fork.");
        exit(1);
    }
    else if (pid_4 > 0)
    {
        dup2(pd[1], STDOUT_FILENO);
        close(pd[0]);
        close(pd[1]);
        close(fd[0]);
        close(fd[1]);
        execl("/bin/ps", "ps",  "hax", "-o", "user", (char *)0);
    }

    if ( (pid_2 = fork()) < 0)
    {
        perror("cannot fork.");
        exit(1);
    }
    else if (pid_2 == 0)
    {
        dup2(pd[0], 0);
        dup2(fd[1], 1);
        close(pd[0]);
                close(pd[1]);
                close(fd[0]);
                close(fd[1]);
        execl("/bin/sort", "sort", "", (char *)0);
    }

    if ( (pid_3 = fork()) < 0)
    {
        perror("cannot fork.");
        exit(1);
    }
    else if (pid_3 == 0)
    {
        dup2(fd[0], 0);
        close(pd[0]);
                close(pd[1]);
                close(fd[0]);
                close(fd[1]);
        execl("/bin/uniq", "uniq", "-c", (char *)0);
    }

    close(pd[0]);
            close(pd[1]);
            close(fd[0]);
            close(fd[1]);

    pid_t terminated;

    int stat;

    while ((terminated = wait(&stat)) > 0)
    {
        printf("Child %d terminated.\n", terminated);
    }

}
else           // child proccess
{
    FILE *fptr = fopen("users.log", "a+");
    if (fptr == NULL)
        fprintf(stderr, "could not open file.\n");
    file_number = fileno(fptr); // getting the file descriptor of fptr
    dup2(zd[0], STDIN_FILENO);
    close(zd[1]);
    close(zd[0]);
    n = read(zd[0], line, MAXLINE);
    printf("Output: (%.*s)\n", n, line);
    write(file_number, line, n);
}

return 0;
}

运行代码似乎不会产生所需的结果。没有任何内容写入文件,我收到此错误:

Signal 17 (CHLD) caught by hax (procps-ng version 3.3.10).
hax:display.c:66: please report this bug

我在这里缺少什么?

0 个答案:

没有答案