如何在C/C++ Linux中写入另一个进程的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;
}

谢谢。

linux process pipe stdin
1个回答
0
投票

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

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

#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);
    }
}

输出应该是:

hello
sed((world))

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

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