필자는 foo가 file1.txt 파일에 쓰는 C : echo 'some string' | foo
에서이 작업을 수행하고 싶습니다. foo를 실행하면 차단되고 stdin에서 입력을 기다린 후 file1.txt에 기록합니다. stdin을 통해 성공적으로 foo에 데이터를 보내고 있지만 foo는 C 파이프를 사용할 때 로컬 파일을 열지 못합니다.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;
}
내부적으로 foo는 로컬 파일에 fopen
호출을하고 오류없는 14 실패하지 않습니다 : EFAULT를. 또한 fork/pipe/dup2/execv 대신 popen/pclose를 사용하여이 작업을 시도했습니다.
이 작업을 수행하려면 어떻게해야합니까?
'fopen'이 EFAULT로 실패하면'fopen' 코드를 보여줄 수 있습니까? 파이프없이 작동합니까? 'fopen'에 제공된 파일 이름이 유효하다는 것을 확신합니까? – cdarke
fopen 코드는 NULL을 반환하는'fopen (file1_name, "w")'처럼 보입니다. 그것은 파이프없이 작동합니다. 제공된 파일 이름이 유효합니다. –
별도로 표시하지 않으려면'자식 프로세스 '라고 표시된 코드 섹션에'fopen'을 포함하는 코드를 넣을 수 있습니다 – anatolyg