2013-02-20 1 views
2

임베디드 리눅스에서 프로그램을 개발 중입니다. 내 프로그램은 데몬 (deamon)이고 printf (stdout 출력)으로 로그를 출력하는 로그 기능을 가지고있다.내 프로그램에서 stdout이 닫힌 것을 (텔넷 세션이 닫혀있을 때) 감지하는 방법은 무엇입니까?

그래서 임베디드 리눅스 시스템에서 텔넷 세션을 연 다음 내 프로그램을 시작하면 텔넷 세션에 출력이 표시됩니다. 텔넷 세션을 닫으면 출력 결과가 어떻게 될지 궁금합니다. 출력은 어디로 리디렉션됩니까?

텔넷 세션을 닫을 때 stdout이 닫혀 있는지 확인할 수 있습니까? stdout이 닫힐 때 로그 기능이 실행되지 않도록하기 위해서.

+1

deamon이 stdout에 전혀 인쇄하지 않아야합니다 ... 그럼에도 불구하고 런타임 오류가 발생할 수 있습니다. 실제로 printf의 반환 값을 검사하여 작성된 문자를 결정할 수 있습니다. 시도해보십시오 ... [return] (http://linux.die.net/man/3/printf) 섹션을 참조하십시오. –

답변

0

ftell 여기에 편리 할 수 ​​있습니다. EBADF 오류를 확인하고 더 이상 기록을 중지 할 수 있습니다. C에서 열려 있지 않은 파일 핸들을 작성하면 정의되지 않은 동작이 발생합니다.

셸과 유사한 환경을 사용하는 경우 환경 자체가 중단 될 수 있으므로 텔넷 세션을 닫을 수 있는지 확실하지 않습니다. 나는 그 행동에 대해 너무 확신하지 못합니다.

+0

'ftell'이'long'을 돌려주기 때문에'if (ftell (stdout) == - 1)'테스트를 할 수 있습니까? – MOHAMED

+0

'ftell (stdout)'을 시도했지만 세션 텔넷이 아직 opend이고 아직 닫지 않았을 때 -1을 반환합니다. – MOHAMED

0

데몬은 SIGHUP을 처리해야합니다. SIGHUP은 터미널이 닫을 때 생성 할 신호입니다. 이를 처리하지 않으면 데몬이 텔넷으로 종료됩니다.

그리고 fd가 연결 해제되면 출력이 손실됩니다. 일반적으로 로깅을 위해서는 syslog() 호출을 사용해야합니다.

+0

'$ my_daemon '으로 데몬을 시작하므로 터미널이 닫히지 않습니다 내 데몬 – MOHAMED

+0

시도해 봤어? 아마 당신은 엉뚱한 터미널을 사용하고 있습니다. 결국 "&"는 SIGHUP과 아무 관련이 없습니다. – LtWorf

관련 문제