2、使用系统调用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 20:52:43 浏览: 138
以下是使用系统调用SHMGET(),SHMAT()编写的长度为1K的消息发送和接收程序,满足题目要求:
主程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#define SHMSZ 1024
int main()
{
char c;
int shmid;
key_t key = 75;
char *shm, *s;
// 创建共享内存
if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
perror("shmget");
exit(1);
}
// 将共享内存附加到进程的地址空间
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
// 将第一个字节置为 0,表示数据空
*shm = 0;
// 等待其他进程发来的消息
while (*shm == 0)
sleep(1);
// 显示收到的消息
printf("Main received %s\n", shm + 1);
// 将共享内存从当前进程中分离
if (shmdt(shm) == -1) {
perror("shmdt");
exit(1);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, 0) == -1) {
perror("shmctl");
exit(1);
}
exit(0);
}
```
进程P1:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#define SHMSZ 1024
int main()
{
char c;
int shmid;
key_t key = 75;
char *shm, *s;
// 创建共享内存
if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
perror("shmget");
exit(1);
}
// 将共享内存附加到进程的地址空间
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
// 等待主程序空闲,可发送请求
while (*shm != 0)
sleep(1);
// 将“HELP”写入共享内存
s = shm + 1;
sprintf(s, "HELP");
*shm = 1;
// 显示发送的消息
printf("P1 send %s\n", s);
// 等待主程序接收到消息
while (*shm != -1)
sleep(1);
// 将共享内存从当前进程中分离
if (shmdt(shm) == -1) {
perror("shmdt");
exit(1);
}
exit(0);
}
```
说明:主程序和进程P1共享一个KEY为75的共享区,主程序将第一个字节置为0表示数据空,等待其他进程发来的消息;进程P1等待主程序空闲,可发送请求,将“HELP”写入共享内存,然后等待主程序接收到消息。
阅读全文