我有一个命令(
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;
}
谢谢。
创建一个管道,连接到读写端的两个 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);
}
}
(但请注意,通过管道和子进程写入到达终端(或连接标准输出的位置)的速度会较慢,因此您可能会对输出进行一些重新排序。如果您不直接写入标准输出,那也没关系来自家长。)