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

Linux下如何在C语言中向另一个进程的STDIN写入数据?

父进程通过fork+execv向子进程STDIN发送数据的解决方案

要实现父进程给子进程的STDIN传递数据,核心是用**管道(pipe)**建立父子进程间的通信通道,再通过文件描述符重定向把子进程的STDIN绑定到管道的读端。以下是修改后的完整实现:

修改后的进程A代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int pid;
    int fd[2]; // fd[0]是管道读端,fd[1]是管道写端

    // 创建管道,失败则退出
    if (pipe(fd) == -1) {
        perror("pipe failed");
        exit(EXIT_FAILURE);
    }

    if ((pid = fork()) > 0) {
        // 父进程:关闭管道读端,用写端发送数据
        close(fd[0]);

        // 这里写要发送给子进程的数据
        const char* data = "Hello from parent process!\nAnother line of data.\n";
        write(fd[1], data, strlen(data));

        // 写完后关闭写端,子进程会收到EOF,结束fgets循环
        close(fd[1]);

        wait(NULL);
    } else if (pid == 0) {
        // 子进程:关闭管道写端,重定向STDIN到管道读端
        close(fd[1]);

        // 把管道读端替换成STDIN(文件描述符0)
        dup2(fd[0], STDIN_FILENO);
        close(fd[0]); // 重定向后原fd[0]可关闭

        char *arg_list[] = {"./cmd_c", NULL};
        int rc = execv("./cmd_c", arg_list);
        // 如果execv执行失败才会走到这里
        perror("execv failed");
        exit(EXIT_FAILURE);
    } else {
        perror("fork failed");
        exit(EXIT_FAILURE);
    }
    return 0;
}

关键步骤解释

  • pipe(fd):创建一个匿名管道,作为父子进程间的数据传递通道
  • 父进程关闭读端fd[0]:父进程只负责写数据,不需要读取管道内容
  • 子进程关闭写端fd[1]:子进程只负责读数据,不需要向管道写入
  • dup2(fd[0], STDIN_FILENO):将子进程的标准输入替换为管道的读端,这样cmd_c调用fgets(stdin)时,实际是从管道读取父进程发送的数据
  • 父进程写完数据后关闭写端fd[1]:触发管道的EOF,让子进程的fgets退出循环,避免子进程一直阻塞等待输入

编译运行验证

  1. 先编译cmd_c:
gcc cmd_c.c -o cmd_c
  1. 编译修改后的进程A:
gcc process_a.c -o process_a
  1. 运行进程A:
./process_a

会看到输出:

XXXXXXXXX Hello from parent process!

XXXXXXXXX Another line of data.

内容的提问来源于stack exchange,提问作者wangt13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:23:11