2010-06-03 3 views
3

C++ 코드와 함께 매우 이상한 행동을하고 있습니다 : 화면 출력을 파일로 재지 정하지 않고 (cygwin 및 Linux에서 재생성 가능) 다른 결과를 제공합니다. 내 말은, 과 같이 실행하고 ./run처럼 실행하거나 ./run >out.log처럼 실행하면 결과가 달라집니다.화면 출력을 파일로 리디렉션하여 C++ 코드의 결과를 변경할 수 있습니까?

화면에 출력하기 위해 std :: cout을 사용합니다. 모든 행은 endl로 끝납니다. 입력 파일에 ifstream을 사용합니다. 출력을 위해 ofstream을 사용합니다. 모든 행은 endl로 끝납니다.

나는 g ++ 4.

무슨 일이 일어나고 있는지 어떤 생각을 사용하고?

업데이트 : 입력 데이터를 하드 코딩 했으므로 'ifstream'이 사용되지 않고 문제가 지속됩니다.

업데이트 2 : 흥미 롭습니다. 나는 처음에 계산되는 세 개의 변수를 탐색 할 한, 그리고 내가 그래서 코드 변수의 반올림 차이가있다

redirected to file: 0 -0.02 0

direct to screen: 0 -0.02 1.04083e-17

를 제출하여 출력을 리디렉션하지 않고 사용하는 경우 무엇을 얻을 출력을 리디렉션 할 때 또는 리디렉션하지 않을 때!

이제 리디렉션이 코드의 내부 계산을 간섭하는 이유는 무엇입니까?

업데이트 3 : 내가/dev/null로 리디렉션하면 파일로 리디렉션하지 않고 화면에 직접 출력하는 것처럼 샘 동작을 얻게됩니다.

+0

어떤 결과가 서로 다른가요? – djna

+0

다른 결과는 무엇입니까? –

+0

'./run> out.log'의 경우 어떻게됩니까? – Stewart

답변

2

nohup으로 실행하면 여러 가지 효과가 있지만 주된 문제는 stdin이며 stdout은/dev/null로 리디렉션됩니다. 대부분의 경우 이것은 stdout이 버퍼 된 라인 (stdout이 터미널 인 경우 버퍼 된 유일한 라인)이 아닌 stdout이 완전히 버퍼링된다는 것을 의미하므로 명시 적으로 플러시 할 때까지 출력되는 내용은 실제로 출력되지 않습니다.

편집

또한 업데이트는 문제가 직접적으로 nohup을의 다른 행동에 관련이 있음직. 이 시점에서 가장 가능성이있는 용의자는 초기화되지 않은 로컬 변수 또는 힙 개체이므로 실행하는 것이 좋습니다 (valgrind). 그러한 변수는 함수가 호출 된 환경에 의존하는 예측할 수없는 (그러나 일반적으로 반복 가능한) 값을 가질 것입니다. 이전에 호출 된 함수가 스택에 남았던 대부분은 nohup에 의존 할 수 있습니다.

+0

기본적으로 로그 파일로 이동하지 않습니까? – Arafangion

+0

아니요, 기본적으로/dev/null로 이동합니다 - OP가 수행 중일 때 명시 적으로 로그 파일로 리디렉션해야합니다. –

+0

+1 런타임 환경에 대한 편집 가능성이 높습니다. –

0

이 응용 프로그램에서 스레드를 사용합니까?

cygwin에서 재현되었는지는 모르겠지만, 리눅스에서 nohup을 사용하거나 사용하지 않은 스레드 응용 프로그램에서 미묘하게 다른 동작을 보았습니다.

필자의 경우 두 개의 초기화 스레드가 있었지만 완료 순서는 (실수로) 중요했습니다. 'nohup'이 없으면 항상 먼저 완료되지만 'nohup'으로 다른 것이 일반적으로 발생합니다. 기본 원인은 IO 버퍼링의 차이라고 생각합니다.

+0

스레딩 없음 ... – Biga

+0

@Biga 오, 언급할만한 가치가있었습니다. 다른 사람들에게 도움이 될 수 있도록 여기에 남겨 두겠습니다. – Stewart

관련 문제