2013-07-18 10 views
2

사용자 지정 사용자 신호에 대해 프로세스가 차단되기를 원합니다. 신호가 도착하면 셸 스크립트에서 대기중인 프로세스를 깨우지 않아야합니까? 코딩 단계 만 필요하면 처리 할 수 ​​있습니까?셸 스크립트의 신호 처리

+1

필요한 명령은'trap'입니다. 이것은 쉘 내장 명령입니다. 많은 "자습서"를 찾으려면 "셸 트랩 신호"를 검색하십시오. –

답변

0

뭘 하려는지 분명하지 않지만 기본적으로 셸 스크립트 "키로거"가 백그라운드에서 듣고 사물을 기반으로 행동하기를 원합니다. 내가 옳다면 왜 그런지 묻지 않을거야. 사과하지 않으면 ;-)

하드 코어로 가고 싶다면/dev/input/event * 파일에 대해 배울 수있다. 파일 시스템과 그 파일 시스템을 따르는 방법. 당신이 정말 설치하고이 설치 시도 할 수 가고 싶은 경우, http://www.slideshare.net/rmorrill/creating-a-keystroke-logger-in-unix-shell-scripting

마지막 : 또는 당신은 키로거 및 loggin에를 만드는이 튜토리얼에서 볼 수 있었다 http://www.justhackitnow.com/2012/03/keylogger-for-linux.html

1

만약 당신이하고자하는 신호 전송 신호 번호 17, 당신은 사용할 수 있습니다 : 신호가 수신 될 때

trap ":" 17 
sleep 1000000 
trap 17 
# ...what you want to happen after the signal is received... 

첫 번째 trap 명령은 인용 명령 (:)를 실행합니다. : 명령은 아무 작업도 수행하지 않습니다. 그러나 trap "" 17을 '신호 무시 17'이라는 의미로 사용할 수 없습니다.이 신호는 원하는 것과 반대입니다.

sleep 1000000은 CPU 리소스를 사용하지 않고 오랜 시간 동안 아무 것도하지 않는 방법입니다.

두 번째 trap은 신호 17에 대한 신호 처리를 취소하고 기본 동작을 복원합니다.

그런 다음 신호를 받으면 실행하려는 코드를 넣을 수 있습니다.


가 대신 sleep를 사용하는 무기한 대기 프로그램, pause을 만들고 사용하는 것을 선호 수도 있습니다 (오히려 위험보다 신호 전에 깨어 난 sleep은 수신). 다음과 같은 간단한 프로그램을 사용할 수 있습니다.

#include <unistd.h> 

int main(void) 
{ 
    pause(); 
    return(0); 
} 

자세한 내용은 일반적으로 반환되지 않습니다. 보통 pause()errno == EINTR과 함께 반환되기 전에 신호가 프로그램을 강제 종료합니다.