编写程序,实现基于无名管道的进程通信。将你的姓名学号(qinguiwei:2022132527)通过子进程传递给父进程。c语言
时间: 2024-10-13 16:03:42 浏览: 35
在C语言中,你可以使用匿名管道(也称为FIFO)来实现实现父子进程之间的通信。以下是创建一个简单的程序示例,它演示了如何在Linux环境下使用无名管道进行进程间通信:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#define BUFFER_SIZE 1024
// 父进程函数
int parent(void) {
int pipefd[2];
char name[] = "qinguiwei:2022132527";
// 创建管道
if (pipe(pipefd) == -1) {
perror("Pipe failed");
exit(EXIT_FAILURE);
}
// 设置管道文件描述符非阻塞
fcntl(pipefd[0], F_SETFL, O_NONBLOCK);
fcntl(pipefd[1], F_SETFL, O_NONBLOCK);
// 写入管道
if (write(pipefd[1], name, strlen(name) + 1) == -1 && errno != EAGAIN) {
perror("Write to pipe failed");
close(pipefd[0]);
close(pipefd[1]);
exit(EXIT_FAILURE);
}
// 关闭未使用的管道端口
close(pipefd[1]);
// 从管道读取信息
char received[BUFFER_SIZE];
ssize_t bytes_read;
while ((bytes_read = read(pipefd[0], received, BUFFER_SIZE)) > 0) {
printf("Received: %s\n", received);
break; // 假设接收一次就结束
}
// 关闭剩余管道并退出
close(pipefd[0]);
return 0;
}
// 子进程函数
int child() {
pid_t pid = fork();
if (pid == 0) { // 子进程
close(0); // 关闭标准输入
dup2(pipefd[0], 0); // 将管道连接到标准输入
execlp("cat", "cat", "-", NULL); // 执行 cat 命令从管道读取内容
perror("Failed to execute cat");
exit(EXIT_FAILURE);
} else {
close(pipefd[0]); // 父进程中关闭写端
wait(NULL); // 等待子进程结束
}
close(pipefd[1]);
return 0;
}
int main() {
if (fork() == 0) { // 进入子进程
child();
} else {
parent();
}
return 0;
}
```
这个程序首先在父进程中创建一个无名管道,并向其中写入字符串"qinguiwei:2022132527"。然后在子进程中,通过改变标准输入设备,使其指向管道,使得子进程能够从管道读取数据。
注意:此示例假设在Linux系统上运行,并且`cat`命令可以接受管道作为输入。实际应用中,可能会考虑其他更安全的方式来传递敏感信息,如加密传输。
阅读全文