You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言:子进程修改文本供父进程使用的管道/fork实现问题

问题分析与解决方案

核心问题

  1. 进程地址空间独立:fork()创建的子进程拥有完全独立的地址空间,子进程修改的text变量和父进程的text是两块毫无关联的内存,父进程根本看不到子进程的修改。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:45:58