2、使用系统调用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 21:51:26 浏览: 52
好的,我明白了你的问题。下面是对应的代码实现:
发送方(P1)代码:
```c
#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
key_t key = 75;
int shmid = shmget(key, 1024, 0666|IPC_CREAT);
char *shmaddr = shmat(shmid, NULL, 0);
while(1)
{
if(*shmaddr == 0)
{
printf("Main is idle, send help.\n");
strcpy(shmaddr, "HELP");
*shmaddr = 1;
break;
}
}
shmdt(shmaddr);
shmctl(shmid, IPC_RMID, 0);
return 0;
}
```
接收方(main)代码:
```c
#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
key_t key = 75;
int shmid = shmget(key, 1024, 0666|IPC_CREAT);
char *shmaddr = shmat(shmid, NULL, 0);
while(1)
{
if(*shmaddr == 1)
{
printf("Main received %s.\n", shmaddr);
*shmaddr = 0;
break;
}
}
shmdt(shmaddr);
shmctl(shmid, IPC_RMID, 0);
return 0;
}
```
这里使用的是共享内存来实现进程间通信。发送方先创建一个共享内存区(大小为1024字节),然后在循环中等待接收方空闲,即共享内存第一个字节为0。一旦接收方空闲,发送方将字符串“HELP”拷贝到共享内存中,并将第一个字节置为1,表示已经发送了消息。最后发送方释放共享内存。
接收方也先创建共享内存区,然后在循环中等待发送方的消息,即共享内存第一个字节为1。一旦接收到消息,接收方打印输出并将第一个字节置为0,表示已经接收到了消息。最后接收方释放共享内存。
需要注意的是,这里的共享内存区只能被两个进程同时使用,如果需要多个进程同时使用,需要修改代码。
阅读全文