编写程序sender,它创建一个共享内存,然后等待用户通过终端输入一串字符,并将这串字符通过共享内存发送给receiver,最后,等待receiver应答,等到应答消息后,它接收到的应答消息显示在终端屏幕上,删除共享内存,结束程序运行。编写receiver程序,它通过共享内存接收来自sender的消息,将消息显示在终端屏幕上,然后再通过该共享内存向sender发送一个应答消息”over”,结束程序的运行。使用有名信号量或System V信号量实现两个进程对共享内存的互斥使用。
时间: 2024-02-22 11:56:35 浏览: 6
好的,下面是一个简单的示例程序,其中使用System V信号量实现了两个进程对共享内存的互斥使用。
sender.c:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.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;
};
void sem_wait(int semid) {
struct sembuf sembuf = {0, -1, SEM_UNDO};
semop(semid, &sembuf, 1);
}
void sem_signal(int semid) {
struct sembuf sembuf = {0, 1, SEM_UNDO};
semop(semid, &sembuf, 1);
}
int main(void) {
int semid, shmid;
char *shmaddr;
char buf[SHM_SIZE];
// 创建信号量
semid = semget(SEM_KEY, 1, 0666 | IPC_CREAT);
if (semid == -1) {
perror("semget");
exit(EXIT_FAILURE);
}
// 初始化信号量
union semun semun = {1};
if (semctl(semid, 0, SETVAL, semun) == -1) {
perror("semctl");
exit(EXIT_FAILURE);
}
// 创建共享内存
shmid = shmget(SHM_KEY, SHM_SIZE, 0666 | IPC_CREAT);
if (shmid == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
// 连接共享内存
shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (char *) -1) {
perror("shmat");
exit(EXIT_FAILURE);
}
printf("Enter a message: ");
fgets(buf, SHM_SIZE, stdin);
sem_wait(semid);
// 将数据写入共享内存
strncpy(shmaddr, buf, SHM_SIZE);
sem_signal(semid);
// 等待receiver应答
sem_wait(semid);
printf("Received response: %s", shmaddr);
sem_signal(semid);
// 分离共享内存
if (shmdt(shmaddr) == -1) {
perror("shmdt");
exit(EXIT_FAILURE);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(EXIT_FAILURE);
}
// 删除信号量
if (semctl(semid, 0, IPC_RMID, semun) == -1) {
perror("semctl");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
```
receiver.c:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.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;
};
void sem_wait(int semid) {
struct sembuf sembuf = {0, -1, SEM_UNDO};
semop(semid, &sembuf, 1);
}
void sem_signal(int semid) {
struct sembuf sembuf = {0, 1, SEM_UNDO};
semop(semid, &sembuf, 1);
}
int main(void) {
int semid, shmid;
char *shmaddr;
char buf[SHM_SIZE];
// 创建信号量
semid = semget(SEM_KEY, 1, 0666 | IPC_CREAT);
if (semid == -1) {
perror("semget");
exit(EXIT_FAILURE);
}
// 创建共享内存
shmid = shmget(SHM_KEY, SHM_SIZE, 0666 | IPC_CREAT);
if (shmid == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
// 连接共享内存
shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (char *) -1) {
perror("shmat");
exit(EXIT_FAILURE);
}
// 从共享内存读取消息
sem_wait(semid);
printf("Received message: %s", shmaddr);
sem_signal(semid);
// 向sender发送应答消息
sem_wait(semid);
strncpy(shmaddr, "over", SHM_SIZE);
sem_signal(semid);
// 分离共享内存
if (shmdt(shmaddr) == -1) {
perror("shmdt");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
```
这两个程序使用了同一个信号量和共享内存,sender程序从终端读取用户输入的消息并写入共享内存,然后等待receiver的应答,接收到应答后将应答消息显示在终端上,最后删除共享内存和信号量。receiver程序从共享内存中读取sender发送的消息并显示在终端上,然后向sender发送一个应答消息”over”,最后删除共享内存和信号量。
使用gcc编译这两个程序:
```
gcc sender.c -o sender
gcc receiver.c -o receiver
```
然后在两个不同的终端中运行这两个程序,就可以看到它们之间成功地通过共享内存进行通信了。