我基本上想在 C 中实现这一点:echo 'some string' | foo
其中 foo 写入文件 file1.txt。运行 foo 使其阻塞并等待来自标准输入的输入,然后写入 file1.txt。我通过标准输入成功地向 foo 发送数据,但是 foo 在使用 C 管道时无法打开本地文件。
这是我所做的:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
FILE *stream;
int fds[2];
int status;
pid_t pid;
char *cmd[] = { "foo", NULL };
pipe(fds);
pid = fork();
if (pid < 0) {
fprintf(stderr, "Fork failed\n");
return 1;
}
if (pid > 0) {
// Parent process
close(fds[0]);
stream = fdopen(fds[1], "w");
fprintf(stream, "some string\n");
fflush(stream);
close(fds[1]);
waitpid(pid, &status, 0);
if (WIFEXITED(status) == 0 || WEXITSTATUS(status) < 0)
return 1;
}
else {
// Child process
close(fds[1]);
dup2(fds[0], STDIN_FILENO);
execv("foo", cmd);
return 1;
}
return 0;
}
内部 foofopen
调用本地文件并失败,错误号为 14:EFAULT。我也尝试过仅使用 popen/pclose 而不是 fork/pipe/dup2/execv 来执行此操作。
我能做些什么来完成这项工作?