c管道工艺无法正常工作

时间:2013-11-06 05:46:10

标签: c process pipe

所以,我在这里遇到管道,叉子和等待问题。

基本上我想要的输出是读取标准输入,将其传递给一个名为ring的函数,然后改变字符串的第一个字符,打印状态消息并将字符串传递给另一个执行该操作的函数。同样的事情并改变,直到我们回到开始,打印最后的消息。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char msg[80];
    int status, process, x;
    process = 0;
    extern void ring(char *string);

    read(0, &msg, sizeof(msg) - 1);
    fflush(stdout);
    x = fork();
    if (x == 0) {
        /* Child */
        ring(msg);
    } else {
        /* Parent */
        wait(&status);
        read(0, &msg, 80);
        printf("process 3 %d %s", getpid(), msg);
    }

    return 0;
}

void ring(char *string) {
    int fd[2];
    char buf[80];

    // create pipe descriptors
    pipe(fd);

    // fork() returns 0 for child process, child-pid for parent process.
    if (fork() != 0)
    {
        // parent: writing only, so close read-descriptor.
        close(fd[0]);

        // send the value on the write-descriptor.
        write(fd[1], string, strlen(string));
        printf("process 2 %d %s", getpid(), string);
        // close the write descriptor
        close(fd[1]);
    }
    else
    {   // child: reading only, so close the write-descriptor
        close(fd[1]);

        // now read the data (will block)
        read(fd[0], &buf, sizeof(string));
        buf[0] += 1;
        fflush(stdout);
        printf("process 1 %d %s", getpid(), buf);

        // close the read-descriptor
        close(fd[0]);
    }
}

给定输出:

$ ./a.out
ring
process 2 33051 ring
process 1 33052 sing

process 3 33050 
ing

期望的输出:

$ ./a.out
ring
process 2 32909 ring
process 1 32910 sing
process 3 32908 ting

0 个答案:

没有答案