2009-09-21 2 views
4

C에서 "백그라운드 모드"로 호출 된 프로그램을 탐지하는 방법은 무엇입니까? 대화 형 또는 백그라운드에서 실행하려는 프로그램이 있습니다.백그라운드 작업 감지

stdin에서 읽지 말고 "Stopped : tty input"상태로 끝내지 말아야합니까?

stdin이 닫혀 있는지 테스트해야합니까? 어떻게해야합니까?

편집 : isatty는 좋은 생각 인 것 같습니다. 그러나 stdin이 파이프 끝이고 tty가 아닌 경우 어떻게됩니까?

답변

3

사용 제어 단말의 파일 디스크립터에 tcgetpgrp() 함수 (예 STDIN_FILENO 0 현재 진행중인 프로세스 그룹이 자신의 프로세스 그룹과 같은지 확인하십시오 (getpgrp()). 그러나 포 그라운드 프로세스 그룹은 프로그램이 포 그라운드와 백그라운드로 이동함에 따라 언제든지 변경 될 수 있습니다. 예를 들어 tcgetpgrp()으로 전화를 걸고 테스트하기 전에 즉시 변경 될 수 있습니다. 이것에 기초하여 어떤 행동을 취하려고한다면 이것을 명심하십시오; SIGTTIN을 피할 수있는 확실한 방법은 아닙니다.

#include <unistd.h> 
pid_t fg = tcgetpgrp(STDIN_FILENO); 
if (fg == -1) { 
    /* stdin is not controlling terminal (e.g. file, pipe, etc.) */ 
} else if (fg == getpgrp()) { 
    /* foreground */ 
} else { 
    /* background */ 
} 
1

1) stdin이 열려 있는지 확인하고 닫으면/dev/null을 열어야합니다.

2) isatty을 사용할 수있는 "수익 1 DESC 터미널 0 연결된 개방형 파일 기술자이면 그렇지 않으면"