使用系统调用SHMGET(),SHMAT()编制一长度为1K的消息发送和接收的程序。 要求: (1)main函数建立一个KEY 为75 的共享区,并将第一个字节置为0。作为数据空的标志等待其他进程发来的消息。收到数据后显示“ Main recieved help ”。 (2)创建一个进程P1,P1建立一个KEY为75的共享区,当共享取得第一个字节为0时,main空闲,可发送请求:P1填入“HELP”,发送数据后显示“P1 send help”。
时间: 2024-02-25 08:52:15 浏览: 19
好的,以下是代码实现:
主程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <string.h>
#define SHMSZ 1024
int main() {
int shmid;
key_t key = 75;
char *shm, *s;
// 创建共享内存
shmid = shmget(key, SHMSZ, IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget");
exit(1);
}
// 将共享内存附加到主程序的数据空间
shm = shmat(shmid, NULL, 0);
if (shm == (char *) -1) {
perror("shmat");
exit(1);
}
// 将第一个字节置为0,表示数据空闲
*shm = 0;
// 等待其他进程发来的消息
while (*shm == 0)
sleep(1);
// 显示收到的消息
printf("Main received %s\n", shm + 1);
// 分离共享内存
shmdt(shm);
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
```
进程P1:
```
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <string.h>
#define SHMSZ 1024
int main() {
int shmid;
key_t key = 75;
char *shm, *s;
// 创建共享内存
shmid = shmget(key, SHMSZ, IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget");
exit(1);
}
// 将共享内存附加到进程P1的数据空间
shm = shmat(shmid, NULL, 0);
if (shm == (char *) -1) {
perror("shmat");
exit(1);
}
// 等待数据空闲
while (*shm != 0)
sleep(1);
// 填入HELP消息
s = shm + 1;
strcpy(s, "HELP");
// 发送数据
*shm = 1;
// 显示发送的消息
printf("P1 send %s\n", s);
// 分离共享内存
shmdt(shm);
return 0;
}
```
编译运行方法:
```
gcc main.c -o main
gcc p1.c -o p1
./main &
./p1
```
输出结果:
```
P1 send HELP
Main received HELP
```
注:以上代码是在Linux环境下编写,Windows环境下需要修改一些函数和头文件。