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