编写一个程序,通过fork()创建一个子进程,父进程和子进程之间以消息队列方式进行通信。子进程从键盘获取一个用户输入的字符串(长度小于128字符),子进程将获取的字符串发送给父进程,父进程接收后在屏幕上打印出
时间: 2024-02-03 20:15:07 浏览: 71
以下是基于Linux的C语言编写的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>
#include <sys/wait.h>
#define MAX_MSG_SIZE 128
typedef struct {
long type;
char data[MAX_MSG_SIZE];
} message;
int main() {
int msgid;
pid_t pid;
message msg;
// 创建消息队列
msgid = msgget(IPC_PRIVATE, 0600);
if (msgid == -1) {
perror("msgget error");
exit(EXIT_FAILURE);
}
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork error");
exit(EXIT_FAILURE);
}
if (pid == 0) { // 子进程
printf("请输入一个字符串:");
fgets(msg.data, MAX_MSG_SIZE, stdin);
msg.type = getpid();
// 发送消息给父进程
if (msgsnd(msgid, &msg, MAX_MSG_SIZE, 0) == -1) {
perror("msgsnd error");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
} else { // 父进程
wait(NULL);
// 接收来自子进程的消息
if (msgrcv(msgid, &msg, MAX_MSG_SIZE, pid, 0) == -1) {
perror("msgrcv error");
exit(EXIT_FAILURE);
}
printf("收到子进程 %d 发来的消息:%s", pid, msg.data);
// 销毁消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl error");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
return 0;
}
```
程序的执行流程如下:
1. 父进程创建一个消息队列,并把队列的标识符存储在变量 `msgid` 中。
2. 父进程调用 `fork()` 创建一个子进程,并把子进程的 PID 存储在变量 `pid` 中。
3. 子进程从键盘读入一个字符串,并把字符串存储在消息结构体的 `data` 字段中。然后,子进程把消息结构体的类型设置为自己的 PID,调用 `msgsnd()` 函数发送消息给父进程。
4. 父进程调用 `wait()` 函数等待子进程结束。
5. 父进程从消息队列中接收消息,并把消息内容打印到屏幕上。
6. 父进程调用 `msgctl()` 函数销毁消息队列。
7. 程序结束。
阅读全文