两个进程实现通信,一个进程循环从终端输入,另一个进程循环打印,当输入quit时结束。共享内存实现。 建议大家先用标志位的方式实现
时间: 2024-03-18 13:41:20 浏览: 45
实现SMTP协议、FTP协议、HTTP协议例子,一个Windows下的框架程序,使用单进程程序模板
好的,这是一个典型的进程间通信问题,可以使用共享内存和信号量来实现。以下是使用标志位的方式实现的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <unistd.h>
#define SHM_SIZE 1024
int main() {
key_t key = ftok(".", 'a'); // 生成key
int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); // 获取共享内存id
char *shmaddr = shmat(shmid, NULL, 0); // 获取共享内存地址
int semid = semget(key, 2, IPC_CREAT | 0666); // 获取信号量id
semctl(semid, 0, SETVAL, 0); // 初始化信号量0为0
semctl(semid, 1, SETVAL, 1); // 初始化信号量1为1
int pid = fork(); // 创建子进程
if (pid > 0) { // 父进程
while (1) {
printf("请输入消息:");
fgets(shmaddr, SHM_SIZE, stdin); // 从标准输入读取消息
semctl(semid, 1, SETVAL, 0); // 将信号量1设置为0,表示写入完成
if (strcmp(shmaddr, "quit\n") == 0) { // 如果输入quit,则退出循环
break;
}
semctl(semid, 0, SETVAL, 1); // 将信号量0设置为1,表示可以读取
}
wait(NULL); // 等待子进程结束
shmdt(shmaddr); // 解除共享内存映射
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
semctl(semid, 0, IPC_RMID, NULL); // 删除信号量
} else if (pid == 0) { // 子进程
while (1) {
semctl(semid, 0, SETVAL, 0); // 将信号量0设置为0,表示等待读取
if (strcmp(shmaddr, "quit\n") == 0) { // 如果接收到quit,则退出循环
break;
}
printf("接收到消息:%s", shmaddr); // 打印接收到的消息
semctl(semid, 1, SETVAL, 1); // 将信号量1设置为1,表示可以写入
}
exit(0); // 退出子进程
} else { // 失败
perror("fork");
exit(1);
}
return 0;
}
```
在上面的代码中,父进程负责从标准输入读取消息,并写入共享内存;子进程负责从共享内存读取消息,并打印出来。通过使用信号量来同步父子进程的操作,避免了竞态条件的发生。当用户输入quit时,父进程会退出循环,并等待子进程结束后释放资源。
阅读全文