0

そのため、ここでパイプ、フォーク、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