2014-07-21 3 views
2

내가 는 setrlimitRLIMIT_CPU와 초 정밀 적은 다음이 몇 가지 방법이 있는지 알 필요가 제안을 c는 setrlimit으로 밀리 초 정밀도를 가질 수 있습니까?는 제목으로

struct rlimit cpulimit; 
cpulimit.rlim_cur = 5; // 5 seconds SIGXCPU 
cpulimit.rlim_max = 5; // 5 seconds SIGKILL 

나는 심지어 밀리 초 정밀도로 필요하지 않은 (I은 일반적인 시스템에서 프로그램이 한 번에 ~ 10ms의를에 걸릴 수 있음을 알고있다). 100ms는 잘 할 것입니다.

struct rlimit cpulimit; 
cpulimit.rlim_cur = 3500; // 3.5 seconds SIGXCPU 
cpulimit.rlim_max = 4500; // 4.5 seconds SIGKILL 

내가이 필요한 이유를 설명의 관련성을 보이지 않는 내가 어떻게 사용 :

그래서 나는 이런 식으로 뭔가가 될 수 궁금합니다. 필요한 경우 질문과 정보를 수정합니다. 사전에

감사합니다,

답변

1

POSIX는 setrlimit에서 두 번째 정밀도 만 허용합니다. 사용할 수있는 특정 확장 기능이있을 수도 있지만 그와 관련된 운영 체제는 알지 못합니다. RLIMIT_CPU은 학생들이 프로그래밍을 배우려는 시도로 할 수있는 피해를 제한해야하는 대학의 다중 사용자 시스템 시대부터 남아 있습니다. 따라서 현대 시스템에서는 거의 연마되고 디버깅되고 개선되지 않습니다.

경험상 나는 RLIMIT_CPU의 CPU 시간과 집행에 대한 통계가 다른 시스템에 끔찍하게 제한되어 있다는 것을 안다. 사용한다면 두 배의 시간이 걸린 후에도 프로세스에 SIGXCPU을 얻지 못할 수도있다. 짧은 시간 초과. 그래서 당신이 해결하고있는 문제가 무엇이든간에, 당신은 아마도 당신이 성취하고자하는 것을 다시 생각하고 그것을 다르게하고 싶을 것입니다.

밀리 초 정밀도로 너무 많은 CPU 시간을 소비 한 프로세스를 죽일 필요가있는 경우 가장 좋은 방법은 하위 프로세스를 충분히 자주 검사하여 충분히 쏘고 감독하는 감독 프로세스를 만드는 것입니다. 그러나 getrusage에서 얻은 카운터는 종종 (시계 중단으로 샘플링 된) 확률 적이며보고 된 CPU 사용량이 실제 CPU 사용량과 상당히 떨어져있을 수 있음을 유의하십시오. 특히 프로세스를 실행하는 초기 단계에서 그렇습니다. RLIMIT_CPU에 사용 된 것과 같지 않음).

+0

RLIMIT_CPU가 "남은 것"이라고 설명해 주셔서 감사합니다. getrusage 솔기가 약간 깜박 거리는 결과를 나타냅니다. 내가 250ms - 2500ms 간격으로 하위 프로세스를 죽이기 전의 시간. 시간에 서브 프로세스를 죽이는 것이 나의 최선의 희망이기 때문에 나는 잠시 동안 setitimer를 가지고 놀 것입니다. 아니면 (ITIMER_REALPROF가있는 setitimer와 같은) 시간 측정에 대한 더 좋은 생각이 있습니까? – Ext

0

당신이, 아니면 그냥 사람을 협력에 잠재적으로 악성 프로그램에 대한 제한을 적용해야합니까? 후자의 경우 치명적인 신호를 전달하는 cputime clock 타이머를 설정하는 것만으로 효과적입니다.