2016-09-30 6 views
2

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에 응답되었음을 알고 있지만 그 해결책은 효과가없는 것처럼 보입니다.

+4

'execvp'가 성공하면 반환되지 않습니다. 'execvp'는 현재 프로세스 이미지를 새로운 프로세스 이미지로 대체합니다. " 즉,'execvp' 호출에 에러가 발생하지 않는 한,'execvp '이후의 코드는 실행되지 않습니다. 아마도'execvp'를 호출하기 전에 먼저'fork'하고 싶을 것입니다. – kaylum

+0

다른 답변이 효과가없는 이유를 알아 냈습니까? 그것은 충실한 충고를 제공합니다. (그리고 광산은 대답이 아닙니다.) 프로그램이 정상적으로 작동하면 질문의 예제는'fork()'가 없으므로'execvp()'가 성공한 후에 아무 것도 실행되지 않습니다. 'execvp()'가 작동하면 마지막 세 줄은 절대 실행되지 않습니다. 당신은''ls ''문자열을''not-the-ls'''로 변경할 수 있습니다 ('not-the-ls'라고하는 명령이 없다고 가정하고). 그러면'to console' 메세지를 보게 될 것입니다. –

+0

수정; 'exec *()'패밀리가 리턴하는 유일한 시간은 그것이 실행되도록 요청받은 것을 실행하는데 실패했을 때뿐입니다. –

답변

2

이후에는 없습니다. execvp 함수 호출이 프로세스를 대체합니다. 성공하면 나머지 코드는 실행되지 않습니다. 재 할당 표준 출력을 다른 위치

이 출신에 갈 관한

0

: http://stackoverflow.com/questions/584868/rerouting-stdin-and-stdout-from-c

왜) (freopen을 사용할 수 있습니까? C89 사양은 다음 섹션을위한 미주 중 하나에 대한 답변을 제공합니다.

116. The primary use of the freopen function is to change the file associated with a standard text stream (stderr, stdin, or stdout), as those identifiers need not be modifiable lvalues to which the value returned by the fopen function may be assigned. 

freopen은 일반적으로 잘못 사용됩니다. stdin = freopen ("newin", "r", stdin) ;. 이것은 fclose (stdin)보다 더 이식성이 없다. stdin = fopen ("newin", "r") ;. 두 표현식 모두 stdin에 할당을 시도하지만 할당 할 수있는 것은 아닙니다.

freopen을 사용하는 올바른 방법은 할당을 생략하는 것입니다. freopen ("newin", "r", stdin);