编写一个程序 message.c,在其中由父进程建立一个信息队列,然后由新建立 的子进程在表明身份后,向消息队列中写如下列信息:Hi,this is child process sending message!。父进程在等待子进程对消息队列写操作完成后,从中读取信息,并显示出来,。 在删除消息队列后结束程序.C语言代码实现加注释
时间: 2024-02-09 17:13:11 浏览: 86
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define MSGKEY 75 // 消息队列 key 值
// 定义消息结构体
struct msgbuf {
long mtype; // 消息类型
char mtext[1024]; // 消息内容
};
int main() {
int msgid; // 消息队列 ID
pid_t pid; // 进程 ID
struct msgbuf msg; // 消息结构体
// 创建消息队列
if ((msgid = msgget(MSGKEY, IPC_CREAT | 0666)) == -1) {
perror("Failed to create message queue");
exit(EXIT_FAILURE);
}
// 创建子进程
pid = fork();
if (pid == -1) {
perror("Failed to fork");
exit(EXIT_FAILURE);
}
if (pid == 0) { // 子进程
msg.mtype = 1; // 设置消息类型
strcpy(msg.mtext, "Hi, this is child process sending message!"); // 设置消息内容
// 向消息队列中写入消息
if (msgsnd(msgid, &msg, strlen(msg.mtext) + 1, 0) == -1) {
perror("Failed to send message");
exit(EXIT_FAILURE);
}
printf("Child process sent message successfully!\n");
exit(EXIT_SUCCESS);
} else { // 父进程
wait(NULL); // 等待子进程结束
// 从消息队列中读取消息
if (msgrcv(msgid, &msg, sizeof(msg.mtext), 1, 0) == -1) {
perror("Failed to receive message");
exit(EXIT_FAILURE);
}
printf("Received message: %s\n", msg.mtext);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("Failed to remove message queue");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
}
```
阅读全文