C语言:子进程修改文本供父进程使用的管道/fork实现问题
问题分析与解决方案
核心问题
- 进程地址空间独立:
fork()创建的子进程拥有完全独立的地址空间,子进程修改的text变量和父进程的text是两块毫无关联的内存,父进程根本看不到子进程的修改。 - Pipe用法错误:
pipe()函数的参数必须是一个大小为2的int数组,用来存储管道的读、写端文件描述符,你直接传入char类型的text数组属于严重误用,会触发未定义行为。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> int main() { pid_t childp; int fd[2]; // 管道文件描述符数组:fd[0]读端,fd[1]写端 char text[100]; // 创建管道,检查是否成功 if (pipe(fd) == -1) { perror("pipe failed"); exit(EXIT_FAILURE); } childp = fork(); if (childp == -1) { perror("fork failed"); exit(EXIT_FAILURE); } if (childp == 0) { // 子进程:关闭读端,仅保留写端 close(fd[0]); const char* msg = "Hello world"; // 写入字符串(+1是包含'\0'结束符,避免父进程打印乱码) write(fd[1], msg, strlen(msg) + 1); close(fd[1]); // 写完关闭写端 exit(EXIT_SUCCESS); } else { // 父进程:关闭写端,仅保留读端 close(fd[1]); // 从管道读取数据到text数组 read(fd[0], text, sizeof(text)); close(fd[0]); printf("%s\n", text); // 等待子进程结束,避免产生僵尸进程 wait(NULL); } return 0; }
关键说明
- 管道是进程间通信的方式,通过读写文件描述符传递数据,而非直接共享内存。
- 子进程负责向管道写端写入数据,父进程从管道读端读取数据,以此实现信息传递。
- 调用
wait(NULL)让父进程等待子进程执行完毕,避免系统中残留僵尸进程。
内容的提问来源于stack exchange,提问作者User19
相关产品推荐
相关产品推荐

