2010-01-18 6 views
9

C로 작성된 Win32 응용 프로그램은 콘솔 출력이 이고 printf()는이 로그 파일로 리디렉션됩니다.출력을 리디렉션 할 때 어떻게 감지합니까?

내 앱을 가지고 있으면 좋을 것 같습니다. 리디렉션 '>'을 사용하거나 사용하지 않고 시작했는지 여부를 감지합니다.

아이디어가 있으십니까?

+2

AFAIK이 작업은 불가능합니다. 그래서 내가 이것을 잘못 읽었는지 확인하기 위해 ... –

+0

알 길이 없습니다. 커맨드 라인 옵션이 다른 기능을 수행하도록하는 프로그램을 보았습니다.이 기능은 출력이 리디렉션 될 때만 켜지는 경우가 많습니다. – Hogan

+1

Windows에서는 100 % 확실하지 않지만 Linux에서는 파이프되거나 그렇지 않은 경우 다르게 동작하는 많은 프로그램이 있습니다 ... 가장 일반적인 예는 "ls"입니다. – fortran

답변

5

톰, 입력 해 주셔서 감사합니다. 응용 프로그램의 출력이 제로에 파일, 또한 fgetpos() 세트 'POS'로 리디렉션 될 때

나는 ..

fpost_t pos ; 

fgetpos (stdout, & pos) ; 

몇 가지 실험을했고, 이것은 나를 위해 작동 발견했다. 그것은 당신을 위해 갓 열린 stderr 이후 의미가 있습니다. EDIT : 실제로 텍스트가 이미 로그/파일로 리디렉션 된 경우 반환되는 값은 양의 정수가 될 수 있습니다. 따라서 코드에서 "if (pos> = 0) bfRedirected = TRUE;"

응용 프로그램의 출력이 리디렉션되지 않는 경우 - 파일이 아닌 콘솔 장치로 전송되므로 fgetpos()는 'pos'를 -1로 설정합니다.

0

AFAIK이 대답은 당신이 할 수 없다는 것입니다. 출력 리다이렉션은 지정된 프로그램의 출력 스트림을 읽고 다른 파이프/스트림으로 리디렉션하는 방식으로 작동합니다. 파일/스트림의 디자인은 작가가 독자가 읽지 않는다는 사실을 모르는 사이에 독자를 모르는 것처럼 보입니다.

정상적인 경우에는 독자가 있기 때문에 독자가 있다는 것을 감지해도 아무 소용이 없습니다. 콘솔이 프로그램의 출력을 읽고 이미 화면에 표시하고 있습니다.

1

파이프가 본질적으로 눈이 멀어서 리디렉션 중인지 여부를 알려주는 기본 제공 방법이 없다고 생각합니다. 더욱이, 추상화 계층 뒤에 어떤 일이 일어나고 있는지 알아 내려고하는 것은 나쁜 습관입니다.

출력을 실제로 제어해야하는 경우 로그 파일 이름을 명령 줄 매개 변수로 추가하십시오!

말했다되고, 당신은 찾아 몇 가지 스마트 추측을 할 수 있습니다 :

  • 프로그램이 실행 된 가장 최근의 명령을 찾아 쉘 명령 내역을 조회 할 수 있습니다.
  • 로그 파일의 경로를 알고있는 경우 해당 디렉토리를 검사하여 파일이 생성되었거나 크기가 변경되었는지 확인할 수 있습니다.
  • 리디렉션되고 리디렉션되지 않을 때의 벤치 마크 작성 속도. 이는 시스템이 매우 안정적이고 환경 조건이 변경되지 않는 경우에만 작동합니다.
2

올바른 방법으로 힌트를 줄 수있는 hit을 빠른 Google에서 산출했습니다.

+0

+1 좋은 답변입니다. 너 해봤 어? –

+0

@Adam : 사실, 그게 나를 놀라게 했어, 아니, 나는 그것을 시도하지 않았다. 나는 그것도 가능하다고 생각하지 않았다! :) – t0mm13b

+1

참고로 codegear에 대한 링크가 작동하지 않으며 Wayback 컴퓨터에도 나타나지 않습니다. –

관련 문제