2013-12-22 5 views
0

어떻게 C로 리눅스 프로그램을 종료 할 수 있습니까? 스크립트를 10 초 동안 만 실행 한 다음 종료하는 타이머 작업을 편집하는 스크립트입니다. ./startmergeX 초 후에 프로그램 종료 Linux C

그것은 필자가 다운로드하는 모든 내 서버에 파일을 함께 병합하는 C 코드,하지만 난 단지는 10 초 동안 실행하려면 :

내가 실행 해요 라인입니다.

( ./startmerge에서 10 초 IO에 소비되지 않은 경우, 즉) 대부분의 시간은 CPU와 컴퓨팅에 소요되는 경우
+0

일반적인 방법은 워치 독 타이머를 사용하여 다른 프로세스로 실행하는 것입니다. 스크립트가 시작되면 생성 된 PID를 저장 한 다음 감시견에게 계속주의를 기울여 필요한 경우 종료 신호를 보냅니다. –

+0

10 초 이내에해야 할 일을 마치지 않으면 어떻게되고 싶습니까? – Bandrami

+1

'alarm (10)'은 꽤 간단하다. 그러나 실제로 당신이 원하는 방식이 아닐 수도있다. 기본 처분은 프로세스를 종료하기 때문에 작은 시그널 핸들러를 작성해야합니다. – Duck

답변

3

은 당신이 CPU 시간을 제한, 그래서 RLIMIT_CPU으로 setrlimit(2) 콜을 사용하고 싶습니다. 배쉬에서는 startmerge을 실행하기 전에

ulimit -t 10 

처럼, (setrlimit 콜 호출)의 ulimit 내장을 사용 this answer을보고 싶어요.

당신의 startmerge 집중 CPU가 아닌 경우, 당신은 아마도 아직 더 나은

startmerge & ; pidof_startmerge=$! 
    sleep 10; kill $pidof_startmerge 

(A sleep 1 주위 예를 들어 루프 열 번) 루프가을 ( this 참조) 10 초 후에 kill에 원하는

C 소스 코드 startmerge에 액세스 할 수 있고이를 향상 시키려면 먼저 time(7)signal(7)을 읽습니다. Duck이 주석 처리되었으므로 alarm(2) 또는 setitimer(2) 또는 timer_create(2)을 고려하고 신호 처리기 -e.g를 설정하십시오. SIGALRMsigaction(2)으로 설정하십시오 (신호 처리기는 비동기 신호 안전 함수 만 호출 할 수 있음을 잊지 말아야하며, 글로벌 volatile sig_atomic_t 변수를 설정하고 해당 변수를 외부에서 테스트 할 수 있음). startmergepoll(2) (또는 이전 select(2))과 같은 일부 멀티플렉싱 시스템을 기반으로하는 event loop이있는 경우 더 간단해야하며 Linux 관련 timerfd_create(2)이 매우 유용 할 수 있습니다.

SIGALRM을 bash에 트랩 할 수 있습니다 (this 참조).

Advanced Linux Programming에는 질문과 관련된 몇 가지 장이 있습니다. Advanced Bash Programming Guide은 읽기에도 유용합니다.

관련 문제