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退出循环,避免子进程一直阻塞等待输入
编译运行验证
- 先编译
cmd_c:
gcc cmd_c.c -o cmd_c
- 编译修改后的进程A:
gcc process_a.c -o process_a
- 运行进程A:
./process_a
会看到输出:
XXXXXXXXX Hello from parent process! XXXXXXXXX Another line of data.
内容的提问来源于stack exchange,提问作者wangt13
相关产品推荐
相关产品推荐

