如何在 Linux 上用 C 写入另一个进程的 stdin?

问题描述 投票:0回答:1

我有一个命令(

cmd_c
)可以从 STDIN 获取输入并处理输入数据。
我想在
process A
中调用此命令,
process A
将向
cmd_c
提供数据。

process A
调用
fork()
+
execv()
启动子进程来运行
cmd_c
的命令,但我没有找到从
process A
发送数据到
cmd_c
的正确方法?

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

int main()
{
    int pid;

    /* continued */
    if ((pid = fork()) > 0) {
///     does something else
///     How to send data to child process's STDIN???
        wait(NULL);
    } else {
        char *arg_list[] = {"./cmd_c", NULL};
        int rc = execv("./cmd_c", arg_list);
        printf("Child execv = %d\n", rc);
    }
    return 0;
}

cmd_c.c
如下,

#include <stdio.h>

int main()
{
        char buf[256];
        while (fgets(buf, sizeof(buf) - 1, stdin)) {
              printf("XXXXXXXXX %s\n", buf);
        }
        return 0;
}

谢谢。

c linux process pipe stdin
1个回答
1
投票

创建一个管道,连接到读写端的两个 fd 以

pipe()
结束,用
dup2()
将它们调整到子级(如果需要的话,还有父级)中的正确位置,然后使用 fd 进行读写。如果您要使用另一个程序,则需要将读取端移至子级中的 stdin fd (0),但如果父级运行您的代码,则可以将其自己的 stdout 与管道写入 fd 分开。
exec()

输出应该是:

#include <unistd.h> #include <sys/wait.h> int main(void) { /* [0] = read end, [1] = write end */ int pipefd[2]; pipe(pipefd); pid_t pid = fork(); if (pid == 0) { /* child, move the read end to stdin and close the orig pipe fds */ close(STDIN_FILENO); dup2(pipefd[0], STDIN_FILENO); close(pipefd[0]); close(pipefd[1]); execlp("sed", "sed", "s/.*/sed((&))/", (char *) NULL); } else { /* parent, close the read end */ close(pipefd[0]); write(STDOUT_FILENO, "hello\n", 6); /* directly to stdout */ write(pipefd[1], "world\n", 6); /* written to the pipe */ /* close the write end when done, so the child exits */ close(pipefd[1]); wait(NULL); } }

(但请注意,通过管道和子进程写入到达终端(或连接标准输出的位置)的速度会较慢,因此您可能会对输出进行一些重新排序。如果您不直接写入标准输出,那也没关系来自家长。)

© www.soinside.com 2019 - 2024. All rights reserved.