编写程序sender,它创建一个共享内存,然后等待用户通过终端输入一串字符,并将这串字符通过共享内存发送给receiver,最后,等待receiver应答,等到应答消息后,它接收到的应答消息显示在终端屏幕上,删除共享内存,结束程序运行。编写receiver程序,它通过共享内存接收来自sender的消息,将消息显示在终端屏幕上,然后再通过该共享内存向sender发送一个应答消息”over”,结束程序的运行。使用有名信号量或System V信号量实现两个进程对共享内存的互斥使用。
时间: 2024-02-22 22:00:46 浏览: 33
好的,这是一个进程间通信的问题,需要使用共享内存、信号量等机制,我可以为您提供相应的 C 语言代码实现。
sender 程序代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
void die(char *msg) {
perror(msg);
exit(EXIT_FAILURE);
}
int main() {
int shmid, semid;
key_t key;
char *shm, *s;
union semun sem_arg;
// 生成共享内存的 key
if ((key = ftok(".", 'a')) == -1) {
die("ftok");
}
// 创建共享内存
if ((shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666)) == -1) {
die("shmget");
}
// 获取共享内存的指针
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
die("shmat");
}
// 创建有名信号量
if ((semid = semget(key, 1, IPC_CREAT | 0666)) == -1) {
die("semget");
}
// 初始化有名信号量
sem_arg.val = 1;
if (semctl(semid, 0, SETVAL, sem_arg) == -1) {
die("semctl");
}
// 等待用户输入消息
printf("请输入消息:");
if (fgets(shm, SHM_SIZE, stdin) == NULL) {
die("fgets");
}
// 等待有名信号量
struct sembuf sem_buf1 = {0, -1, 0};
if (semop(semid, &sem_buf1, 1) == -1) {
die("semop");
}
// 发送消息到共享内存
for (s = shm; *s != '\0'; s++) {
if (*s == '\n') {
*s = '\0';
}
}
// 释放有名信号量
struct sembuf sem_buf2 = {0, 1, 0};
if (semop(semid, &sem_buf2, 1) == -1) {
die("semop");
}
// 等待有名信号量
if (semop(semid, &sem_buf1, 1) == -1) {
die("semop");
}
// 等待接收到应答消息
while (*shm != '*') {
sleep(1);
}
// 显示应答消息
printf("接收到应答消息:%s\n", shm + 1);
// 删除共享内存
if (shmctl(shmid, IPC_RMID, 0) == -1) {
die("shmctl");
}
// 删除有名信号量
if (semctl(semid, 0, IPC_RMID, sem_arg) == -1) {
die("semctl");
}
return 0;
}
```
receiver 程序代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
void die(char *msg) {
perror(msg);
exit(EXIT_FAILURE);
}
int main() {
int shmid, semid;
key_t key;
char *shm;
union semun sem_arg;
// 生成共享内存的 key
if ((key = ftok(".", 'a')) == -1) {
die("ftok");
}
// 获取共享内存
if ((shmid = shmget(key, SHM_SIZE, 0666)) == -1) {
die("shmget");
}
// 获取共享内存的指针
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
die("shmat");
}
// 获取有名信号量
if ((semid = semget(key, 1, 0666)) == -1) {
die("semget");
}
// 等待有名信号量
struct sembuf sem_buf1 = {0, -1, 0};
if (semop(semid, &sem_buf1, 1) == -1) {
die("semop");
}
// 接收到 sender 发送的消息
printf("接收到消息:%s\n", shm);
// 发送应答消息到共享内存
sprintf(shm, "*over");
// 释放有名信号量
struct sembuf sem_buf2 = {0, 1, 0};
if (semop(semid, &sem_buf2, 1) == -1) {
die("semop");
}
return 0;
}
```
注意,这里使用了有名信号量来进行进程间的同步,保证了 sender 和 receiver 对共享内存的互斥使用。此外,sender 发送完消息后会等待 receiver 的应答消息,所以 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)