父进程发送消息,三个子进程分别读。
时间: 2023-08-07 15:34:42 浏览: 91
这个问题涉及到进程间通信(Inter-Process Communication,IPC)的知识。在Linux系统中,有多种实现IPC的方式,如管道(Pipe)、消息队列(Message Queue)、共享内存(Shared Memory)、信号量(Semaphore)等等。
对于这个问题,可以使用消息队列实现。具体实现步骤如下:
1. 创建消息队列
父进程使用`msgget`函数创建一个消息队列,并将返回的消息队列标识符保存下来。
2. 发送消息
父进程使用`msgsnd`函数向消息队列发送消息。消息包括一个消息类型和消息内容。
3. 接收消息
子进程使用`msgrcv`函数从消息队列中接收消息。需要指定要接收的消息类型,如果消息队列中没有指定类型的消息,则阻塞等待直到有符合条件的消息到达。
代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_TYPE 1
struct msgbuf {
long mtype;
char mtext[1024];
};
int main() {
key_t key = ftok(".", 'a');
int msqid = msgget(key, IPC_CREAT | 0666);
if (msqid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
pid_t pid;
for (int i = 0; i < 3; i++) {
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程接收消息
struct msgbuf msg;
if (msgrcv(msqid, &msg, sizeof(msg.mtext), MSG_TYPE, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
printf("子进程 %d 接收到消息:%s\n", getpid(), msg.mtext);
exit(EXIT_SUCCESS);
}
}
// 父进程发送消息
struct msgbuf msg;
msg.mtype = MSG_TYPE;
sprintf(msg.mtext, "Hello, World!");
if (msgsnd(msqid, &msg, sizeof(msg.mtext), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
// 等待子进程退出
for (int i = 0; i < 3; i++) {
wait(NULL);
}
// 删除消息队列
if (msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
return 0;
}
```
在上面的示例代码中,我们使用`msgget`函数创建了一个消息队列,并返回了消息队列标识符`msqid`。然后使用`fork`函数创建了三个子进程,在每个子进程中使用`msgrcv`函数从消息队列中接收消息。父进程使用`msgsnd`函数向消息队列发送一条消息。最后,等待所有子进程退出后,使用`msgctl`函数删除消息队列。
注意:这个示例代码只是一种实现方式,实际应用中需要根据具体情况选择合适的IPC方式。
阅读全文