编写一个程序 message.c,在其中由父进程建立一个信息队列,然后由新建立 的子进程在表明身份后, 向消息队列中写如下列信息: Hi,this is child process sending message!。父进程在等待子进程对消息队列写操作完成后,从中读取信息,并显示出来,。 在删除消息队列后结束程序,C语言代码
时间: 2024-02-10 07:10:40 浏览: 81
下面是实现上述功能的message.c程序代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include <string.h>
// 定义消息结构体
struct msgbuf {
long mtype;
char mtext[256];
};
int main() {
int msgid;
pid_t pid;
struct msgbuf msg;
key_t key;
// 生成key
if ((key = ftok(".", 'a')) < 0) {
perror("ftok error");
exit(EXIT_FAILURE);
}
// 创建消息队列
if ((msgid = msgget(key, IPC_CREAT | 0666)) < 0) {
perror("msgget error");
exit(EXIT_FAILURE);
}
// 创建子进程
if ((pid = fork()) < 0) {
perror("fork error");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程向消息队列中写入消息
msg.mtype = 1;
strcpy(msg.mtext, "Hi,this is child process sending message!");
if (msgsnd(msgid, &msg, strlen(msg.mtext), 0) < 0) {
perror("msgsnd error");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
// 等待子进程完成写操作
wait(NULL);
// 父进程从消息队列中读取消息
if (msgrcv(msgid, &msg, sizeof(msg.mtext), 1, 0) < 0) {
perror("msgrcv error");
exit(EXIT_FAILURE);
}
// 显示消息内容
printf("%s\n", msg.mtext);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) < 0) {
perror("msgctl error");
exit(EXIT_FAILURE);
}
return 0;
}
```
代码中,我们使用了消息队列来实现进程间的通信。父进程先创建一个消息队列,然后再创建子进程。子进程在表明身份后,向消息队列中写入一条消息,然后退出。父进程在等待子进程完成写操作后,从消息队列中读取消息,并显示出来。最后,父进程删除消息队列,程序结束。
阅读全文