使用系统调用SHMGET(),SHMAT()编制一长度为1K的消息发送和接收的程序。 要求: (1)main函数建立一个KEY 为75 的共享区,并将第一个字节置为0。作为数据空的标志等待其他进程发来的消息。收到数据后显示“ Main recieved help ”。 (3)创建一个进程P1,P1建立一个KEY为75的共享区,当共享取得第一个字节为0时,main空闲,可发送请求:P1填入“HELP”,发送数据后显示“P1 send help”。
时间: 2024-02-25 16:51:55 浏览: 54
好的,这是一个稍微复杂一些的问题,需要编写两个程序,一个用来发送消息,另一个用来接收消息。下面分别介绍这两个程序的实现。
程序一:发送消息
首先,需要引入以下头文件:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <string.h>
```
然后,我们可以定义一个结构体,用来存储共享内存区中的数据:
```c
struct shared_data {
char data[1024];
};
```
接下来,我们可以编写主函数:
```c
int main() {
int shmid;
struct shared_data *shared_mem;
key_t key = 75;
// 创建共享内存区
shmid = shmget(key, sizeof(struct shared_data), IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget");
exit(1);
}
// 附加共享内存区
shared_mem = (struct shared_data *) shmat(shmid, NULL, 0);
if (shared_mem == (struct shared_data *) -1) {
perror("shmat");
exit(1);
}
// 循环等待共享内存区第一个字节为0
while (shared_mem->data[0] != 0);
// 将消息填入共享内存区,并将第一个字节置为1
strcpy(shared_mem->data, "HELP");
shared_mem->data[0] = 1;
printf("P1 send help\n");
// 分离共享内存区
shmdt(shared_mem);
return 0;
}
```
在上面的代码中,我们首先创建了一个 KEY 为 75 的共享内存区,并循环等待共享内存区第一个字节为0。如果第一个字节为0,就将消息填入共享内存区,并将第一个字节置为1,表示共享内存区中有数据可供接收。最后,分离共享内存区。
程序二:接收消息
首先,需要引入以下头文件:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <string.h>
```
然后,我们可以定义一个结构体,用来存储共享内存区中的数据:
```c
struct shared_data {
char data[1024];
};
```
接下来,我们可以编写主函数:
```c
int main() {
int shmid;
struct shared_data *shared_mem;
key_t key = 75;
// 创建共享内存区
shmid = shmget(key, sizeof(struct shared_data), IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget");
exit(1);
}
// 附加共享内存区
shared_mem = (struct shared_data *) shmat(shmid, NULL, 0);
if (shared_mem == (struct shared_data *) -1) {
perror("shmat");
exit(1);
}
// 将第一个字节置为0,作为数据空的标志
shared_mem->data[0] = 0;
// 循环等待其他进程发来的消息
while (1) {
if (shared_mem->data[0] == 1) {
printf("Main recieved %s\n", shared_mem->data);
shared_mem->data[0] = 0;
break;
}
}
// 分离共享内存区
shmdt(shared_mem);
// 删除共享内存区
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
```
在上面的代码中,我们首先创建了一个 KEY 为 75 的共享内存区,并将第一个字节置为0,作为数据空的标志。然后,我们进入一个循环,等待其他进程发来的消息。如果收到了消息,就将第一个字节置为0,并显示 "Main recieved"。
注意,在接收消息的程序中,我们还需要删除共享内存区,因为这个程序是最后一个使用这个共享内存区的程序。
这样,我们就完成了一个基于共享内存的消息发送和接收的程序。
阅读全文