在Linux环境下编写1个程序,使用系统调用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 18:52:44 浏览: 59
好的,这是一个经典的进程间通信问题,我们可以使用共享内存来实现进程间通信。以下是一个参考实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#define KEY 75
#define MSG_SIZE 1024
int main() {
int shmid = shmget(KEY, MSG_SIZE, 0666|IPC_CREAT); // 创建共享内存
if (shmid == -1) {
perror("Failed to create shared memory");
exit(1);
}
char *msg = (char *) shmat(shmid, (void *) 0, 0); // 将共享内存连接到当前进程的地址空间
if (msg == (char *) -1) {
perror("Failed to attach shared memory");
exit(1);
}
msg[0] = 0; // 第一个字节置为0,表示数据空的标志
pid_t pid = fork(); // 创建子进程
if (pid == -1) {
perror("Failed to create child process");
exit(1);
}
if (pid == 0) { // 子进程
char *data = "HELP";
while (1) {
while (msg[0] != 0) { // 等待数据空的标志
sleep(1);
}
printf("P1 send %s\n", data);
sprintf(msg + 1, "%s", data);
msg[0] = 1; // 设置数据满的标志
}
} else { // 父进程
while (1) {
while (msg[0] != 1) { // 等待数据满的标志
sleep(1);
}
printf("Main recieved %s\n", msg + 1);
msg[0] = 0; // 设置数据空的标志
}
}
shmdt(msg); // 分离共享内存
shmctl(shmid, IPC_RMID, 0); // 删除共享内存
return 0;
}
```
上述代码中,我们首先创建了一个大小为1K,权限为0666的共享内存,然后将其连接到当前进程的地址空间。在主进程中,我们将第一个字节置为0,表示数据空的标志,然后创建一个子进程P1。在P1中,我们不断地等待数据空的标志,如果收到则将"HELP"写入共享内存,并将第一个字节置为1,表示数据满的标志。在主进程中,我们不断地等待数据满的标志,如果收到则读取共享内存中的数据,并将第一个字节置为0,表示数据空的标志。最后,我们分离共享内存并删除共享内存。
阅读全文