0

所以,我在这里遇到了管道问题,fork 并在 c 中等待。

基本上我想要的输出是读入标准输入,将其传递给一个调用的函数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
4

0 回答 0