使用系统调用SHMGET(),SHMAT()编制一长度为1K的消息发送和接收的程序。 要求: (1)main函数建立一个KEY 为75 的共享区,并将第一个字节置为0。作为数据空的标志等待其他进程发来的消息。收到数据后显示“ Main recieved help ”。 (3)创建一个进程P1,P1建立一个KEY为75的共享区,当共享取得第一个字节为0时,main空闲,可发送请求:P1填入“HELP”,发送数据使用系统调用SHMGET(),SHMAT()编制一长度为1K的消息发送和接收的程序。 要求: (1)main函数建立一个KEY 为75 的共享区,并将第一个字节置为0。作为数据空的标志等待其他进程发来的消息。收到数据后显示“ Main recieved help ”。 (3)创建一个进程P1,P1建立一个KEY为75的共享区,当共享取得第一个字节为0时,main空闲,可发送请求:P1填入“HELP”,发送数据后显示“P1 send help”。后显示“P1 send help”。
时间: 2024-02-25 21:53:00 浏览: 51
编制一个长度为1K的消息发送和接受的程序。
4星 · 用户满意度95%
好的,这是一个关于进程间通信的问题。具体实现可以参考以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#define SHM_KEY 75
#define SHM_SIZE 1024
int main() {
int shmid = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget error");
exit(EXIT_FAILURE);
}
char *shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (char *)-1) {
perror("shmat error");
exit(EXIT_FAILURE);
}
// 将第一个字节置为0,表示数据空闲
*shmaddr = 0;
pid_t pid = fork();
if (pid < 0) {
perror("fork error");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程P1
char *msg = "HELP";
while (1) {
// 等待主进程的空闲
while (*shmaddr != 0) {
sleep(1);
}
// 发送消息
memcpy(shmaddr + 1, msg, strlen(msg));
*shmaddr = 1;
printf("P1 send help\n");
// 等待主进程接收完成
while (*shmaddr != 0) {
sleep(1);
}
}
} else {
// 主进程
while (1) {
// 等待数据到达
while (*shmaddr == 0) {
sleep(1);
}
// 接收消息
char *msg = shmaddr + 1;
printf("Main recieved %s\n", msg);
// 处理消息
*msg = toupper(*msg);
// 发送消息
*shmaddr = 0;
sleep(1);
}
}
return 0;
}
```
在这个程序中,主进程和子进程P1共享了一个大小为1K的共享内存区域,用于传递消息。主进程在共享内存区域的第一个字节作为数据空闲的标志,如果为0表示没有数据,如果为1表示有数据。子进程P1等待主进程的空闲,然后向共享内存区域中写入消息,将数据空闲标志置为1。主进程检测到数据到达后,将数据空闲标志置为0,处理消息并将结果返回给子进程P1。子进程P1检测到数据空闲标志变为0后,继续等待主进程的空闲,重复以上过程。
希望这个程序能够解决你的问题,如果还有其他问题,请随时提出。
阅读全文