使用系统调用SHMGET(),SHMAT()编制一长度为1K的消息发送和接收的程序。 要求:创建一个进程P1,P1建立一个KEY为75的共享区,当共享取得第一个字节为0时,main空闲,可发送请求:P1填入“HELP”,发送数据后显示“P1 send help”。
时间: 2024-02-25 18:53:14 浏览: 22
好的,以下是一个使用系统调用SHMGET(),SHMAT()编制一长度为1K的消息发送和接收的程序,满足你的要求。
P1进程代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main()
{
int shmid, key = 75;
char *shm, *s;
// 创建共享内存
if ((shmid = shmget(key, SHM_SIZE, 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);
}
strcpy(shm + 1, "HELP");
*shm = 1;
printf("P1 send help\n");
// 断开连接共享内存
if (shmdt(shm) == -1) {
perror("shmdt");
exit(1);
}
exit(0);
}
```
这个程序首先创建一个KEY为75的共享内存,并将第一个字节置为0,表示空消息。然后它进入一个循环,等待main进程空闲。当main进程空闲时,它将字符串"HELP"复制到共享内存中,并将第一个字节置为1,表示有数据可读。然后它显示"P1 send help",断开连接共享内存并退出。
Main进程代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main()
{
int shmid, key = 75;
char *shm, *s;
// 创建共享内存
if ((shmid = shmget(key, SHM_SIZE, 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);
}
// 显示收到的数据
printf("Main recieved %s\n", shm + 1);
// 将第一个字节置为0,表示空消息
*shm = 0;
// 断开连接共享内存
if (shmdt(shm) == -1) {
perror("shmdt");
exit(1);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(1);
}
exit(0);
}
```
这个程序首先创建一个KEY为75的共享内存,并将第一个字节置为0,表示空消息。然后它进入一个循环,等待P1进程发送数据。当收到数据后,它会显示"Main recieved HELP",然后将第一个字节置为0,表示空消息。最后,它断开连接共享内存并删除共享内存。
注意:这是一个简单的示例程序,只能用于学习和理解使用系统调用SHMGET(),SHMAT()编制一长度为1K的消息发送和接收的程序的基本原理。在实际应用中,需要考虑更多的细节和安全性问题。