execvp
명령이 파일로 전송되도록 파일 설명자를 변경하고 싶습니다. 그런 다음 stdout
을 다시 콘솔로 재설정하고 싶습니다. C 파일을 stdout으로 보내고 다시 설정하는 중
이
내가 지금까지 무엇을 가지고 :int main() {
printf("to console\n");
int stdoutfd = dup(STDOUT_FILENO);
FILE* file = fopen("./test.txt","ab+");
int filefd = fileno(file);
dup2(filefd,STDOUT_FILENO);
char *args[] = {"ls","-la",NULL};
execvp(args[0],args);
dup2(stdoutfd,STDOUT_FILENO);
close(stdoutfd);
printf("to console\n");
}
첫 번째 printf
인쇄 콘솔에의 test.txt
파일로 인쇄됩니다은 "LS -la"명령에 다음 execvp는,하지만 내 문제가 있다는 것입니다 두 번째 printf
은 아무데도 인쇄하지 않습니다.
나는 유사한 질문이 C restore stdout to terminal에 응답되었음을 알고 있지만 그 해결책은 효과가없는 것처럼 보입니다.
'execvp'가 성공하면 반환되지 않습니다. 'execvp'는 현재 프로세스 이미지를 새로운 프로세스 이미지로 대체합니다. " 즉,'execvp' 호출에 에러가 발생하지 않는 한,'execvp '이후의 코드는 실행되지 않습니다. 아마도'execvp'를 호출하기 전에 먼저'fork'하고 싶을 것입니다. – kaylum
다른 답변이 효과가없는 이유를 알아 냈습니까? 그것은 충실한 충고를 제공합니다. (그리고 광산은 대답이 아닙니다.) 프로그램이 정상적으로 작동하면 질문의 예제는'fork()'가 없으므로'execvp()'가 성공한 후에 아무 것도 실행되지 않습니다. 'execvp()'가 작동하면 마지막 세 줄은 절대 실행되지 않습니다. 당신은''ls ''문자열을''not-the-ls'''로 변경할 수 있습니다 ('not-the-ls'라고하는 명령이 없다고 가정하고). 그러면'to console' 메세지를 보게 될 것입니다. –
수정; 'exec *()'패밀리가 리턴하는 유일한 시간은 그것이 실행되도록 요청받은 것을 실행하는데 실패했을 때뿐입니다. –