、使用系统调用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 22:51:45 浏览: 61
好的,我会尽力回答你的问题。以下是针对你的问题的回答:
这是一个需要使用共享内存来实现进程通信的程序。主要涉及到两个系统调用:SHMGET() 和 SHMAT()。
首先,我们需要在主函数中创建一个 KEY 为 75 的共享区,并将其第一个字节置为 0,作为数据空的标志等待其他进程发来的消息。代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHMSZ 1024
int main() {
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);
}
*shm = 0;
while (*shm == 0);
printf("Main recieved help\n");
shmdt(shm);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
```
接下来,我们需要创建一个进程 P1,P1 建立一个 KEY 为 75 的共享区,当共享取得第一个字节为 0 时,main 空闲,可发送请求:P1 填入“HELP”,发送数据后显示“P1 send help”。代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHMSZ 1024
int main() {
int shmid;
key_t key = 75;
char *shm, *s;
char *msg = "HELP";
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);
printf("P1 send help\n");
s = shm + 1;
memcpy(s, msg, strlen(msg) + 1);
*shm = 1;
shmdt(shm);
return 0;
}
```
以上就是使用 SHMGET() 和 SHMAT() 编制一长度为 1K 的消息发送和接收的程序的实现过程。
阅读全文