编写程序sender,它创建一个共享内存,然后等待用户通过终端输入一串字符,并将这串字符通过共享内存发送给receiver,最后,等待receiver应答,等到应答消息后,它接收到的应答消息显示在终端屏幕上,删除共享内存,结束程序运行。编写receiver程序,它通过共享内存接收来自sender的消息,将消息显示在终端屏幕上,然后再通过该共享内存向sender发送一个应答消息”over”,结束程序的运行。使用有名信号量或System V信号量实现两个进程对共享内存的互斥使用。
时间: 2024-02-25 09:51:55 浏览: 19
好的,我理解了你的问题。这是一个经典的进程间通信问题,可以使用共享内存和信号量进行解决。以下是基于System V信号量的示例代码:
sender.c
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
#define SEM_KEY 1234
#define SHM_KEY 5678
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main() {
int sem_id, shm_id;
char *shm_ptr;
union semun sem_arg;
struct sembuf sem_op;
// 创建信号量
sem_id = semget(SEM_KEY, 1, IPC_CREAT | 0666);
if (sem_id < 0) {
perror("semget error");
exit(1);
}
// 初始化信号量的值为0
sem_arg.val = 0;
if (semctl(sem_id, 0, SETVAL, sem_arg) < 0) {
perror("semctl error");
exit(1);
}
// 创建共享内存
shm_id = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
if (shm_id < 0) {
perror("shmget error");
exit(1);
}
// 连接共享内存
shm_ptr = shmat(shm_id, NULL, 0);
if (shm_ptr == (char *) -1) {
perror("shmat error");
exit(1);
}
// 从终端读取输入
printf("Please input a message:\n");
fgets(shm_ptr, SHM_SIZE, stdin);
// 发送信号量,通知receiver可以读取共享内存
sem_op.sem_num = 0;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
if (semop(sem_id, &sem_op, 1) < 0) {
perror("semop error");
exit(1);
}
// 等待receiver的应答
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
if (semop(sem_id, &sem_op, 1) < 0) {
perror("semop error");
exit(1);
}
// 显示receiver的应答
printf("Received response: %s\n", shm_ptr);
// 删除共享内存
shmdt(shm_ptr);
shmctl(shm_id, IPC_RMID, NULL);
// 删除信号量
semctl(sem_id, 0, IPC_RMID, sem_arg);
return 0;
}
```
receiver.c
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
#define SEM_KEY 1234
#define SHM_KEY 5678
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main() {
int sem_id, shm_id;
char *shm_ptr;
union semun sem_arg;
struct sembuf sem_op;
// 创建信号量
sem_id = semget(SEM_KEY, 1, IPC_CREAT | 0666);
if (sem_id < 0) {
perror("semget error");
exit(1);
}
// 创建共享内存
shm_id = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
if (shm_id < 0) {
perror("shmget error");
exit(1);
}
// 连接共享内存
shm_ptr = shmat(shm_id, NULL, 0);
if (shm_ptr == (char *) -1) {
perror("shmat error");
exit(1);
}
// 等待sender写入共享内存
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
if (semop(sem_id, &sem_op, 1) < 0) {
perror("semop error");
exit(1);
}
// 显示sender写入的消息
printf("Received message: %s", shm_ptr);
// 向sender发送应答消息
strcpy(shm_ptr, "over");
// 发送信号量,通知sender可以读取共享内存
sem_op.sem_num = 0;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
if (semop(sem_id, &sem_op, 1) < 0) {
perror("semop error");
exit(1);
}
// 删除共享内存
shmdt(shm_ptr);
shmctl(shm_id, IPC_RMID, NULL);
// 删除信号量
semctl(sem_id, 0, IPC_RMID, sem_arg);
return 0;
}
```
使用gcc编译以上代码:
```
$ gcc sender.c -o sender
$ gcc receiver.c -o receiver
```
然后打开两个终端,一个运行sender,一个运行receiver,就可以进行进程间通信了。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)