编写一个程序,通过fork()创建一个子进程,父进程和子进程之间以消息队列方式进行通信。子进程从键盘获取一个用户输入的字符串(长度小于128字符),子进程将获取的字符串发送给父进程,父进程接收后在屏幕上打印出该字符串。
时间: 2023-06-24 08:08:18 浏览: 47
下面是一个简单的 C 语言程序,实现了上述要求:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_TEXT 128
struct msgbuf {
long mtype;
char mtext[MAX_TEXT];
};
int main() {
int msgid;
pid_t pid;
struct msgbuf msg;
// 创建消息队列
msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) { // 子进程
char text[MAX_TEXT];
printf("请输入一个字符串(长度不超过 %d):", MAX_TEXT);
fgets(text, MAX_TEXT, stdin);
text[strlen(text)-1] = '\0'; // 去掉换行符
// 发送消息给父进程
strcpy(msg.mtext, text);
msg.mtype = 1;
if (msgsnd(msgid, &msg, strlen(msg.mtext)+1, 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
} else { // 父进程
// 接收消息
if (msgrcv(msgid, &msg, MAX_TEXT, 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
printf("父进程收到消息:%s\n", msg.mtext);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
}
```
程序首先创建一个消息队列,然后通过 `fork()` 创建子进程。在子进程中,使用 `fgets()` 从键盘获取一个字符串,然后将该字符串发送给父进程。父进程通过调用 `msgrcv()` 接收消息,并在屏幕上打印出该字符串。最后,父进程删除消息队列,程序结束。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)