所以,我在这里遇到管道,叉子和等待问题。
基本上我想要的输出是读取标准输入,将其传递给一个名为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