两个进程实现通信,一个进程循环从终端输入,另一个进程循环打印,当输入quit时结束.// 建议大家先用标志位的方式实现,不建议使用信号量。
时间: 2024-05-06 20:21:59 浏览: 96
首先,我们需要创建两个进程,一个进程负责从终端输入,另一个进程负责打印。我们可以使用fork()函数来创建子进程。
在父进程中,我们可以使用循环来不断从终端输入内容,并将输入的内容发送给子进程。当输入quit时,我们将一个标志位设置为1,表示需要结束通信了。
在子进程中,我们也可以使用循环来不断接收父进程发送过来的内容,并将接收到的内容打印出来。当父进程发送quit时,子进程也将结束循环打印。
下面是具体的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_BUF_SIZE 1024
int main() {
int fds[2];
pid_t pid;
if (pipe(fds) < 0) {
perror("pipe error");
exit(1);
}
if ((pid = fork()) < 0) {
perror("fork error");
exit(1);
} else if (pid > 0) { // 父进程负责输入
close(fds[0]); // 关闭读端
int flag = 0;
char buf[MAX_BUF_SIZE];
while (!flag) {
printf("请输入要发送的内容:");
fgets(buf, MAX_BUF_SIZE, stdin);
buf[strlen(buf) - 1] = '\0'; // 去掉换行符
if (strcmp(buf, "quit") == 0) {
flag = 1;
} else {
write(fds[1], buf, strlen(buf));
}
}
close(fds[1]); // 关闭写端
exit(0);
} else { // 子进程负责打印
close(fds[1]); // 关闭写端
char buf[MAX_BUF_SIZE];
while (read(fds[0], buf, MAX_BUF_SIZE) > 0) {
printf("接收到的内容:%s\n", buf);
if (strcmp(buf, "quit") == 0) {
break;
}
}
close(fds[0]); // 关闭读端
exit(0);
}
}
```
在上面的代码中,我们使用了管道来实现进程间通信。在父进程中,我们关闭了管道的读端,并在循环中使用fgets()函数来从终端输入内容,并将输入的内容写入管道的写端。当输入quit时,我们将标志位设置为1,并退出循环。最后,我们关闭管道的写端,退出进程。
在子进程中,我们关闭了管道的写端,并在循环中使用read()函数来从管道的读端读取内容,并将读取到的内容打印出来。当接收到的内容为quit时,我们也退出循环。最后,我们关闭管道的读端,退出进程。
阅读全文