2016-12-25 6 views
0

코드에서 타이머를 사용해야합니다.리눅스 타이머 CLOCK_PROCESS_CPU_ID가 작동하지 않습니다.

#define SECOND 1000000000 

C가 2.25

같은 것입니다 그리고 내 문제는 다음과 같습니다 c_thread 새로운 타이머를 설정하는 것입니다 몇 가지 간단한 기능입니다

struct sigevent ec; 

    ec.sigev_notify = SIGEV_THREAD; 
    ec.sigev_value.sival_ptr = &c_timer; 
    ec.sigev_notify_function = c_thread; 
    ec.sigev_notify_attributes = NULL; 

    secs = floor(c); 
    nsecs = (long long) SECOND * (c - secs); 
    printf("%ds\t%lldns\n\n",secs,nsecs); 
    it1c.it_value.tv_sec = secs; 
    it1c.it_value.tv_nsec = nsecs; 
    it1c.it_interval.tv_sec = 0; 
    it1c.it_interval.tv_nsec = 0; 

    timer_create(CLOCK_PROCESS_CPUTIME_ID, &ec, &c_timer); 
    timer_settime(c_timer, 0, &it1c, NULL); 

, SECOND는 : 나는 이런 식으로 뭔가있어 이 타이머는해야 할 때 c_thread를 호출하지 않는다. CLOCK_PROCESS_CPUTIME_ID를 CLOCK_REALTIME로 변경하면 모든 것이 정상이며 호출되지만 처음 사용할 때 아무 일도 일어나지 않습니다. 또한 clock_gettime 함수와 다른 CLOCK_REALTIME 타이머를 사용하여 CLOCK_PROCESS_CPUTIME_ID를 확인하고 시계의 값이 my it_value에 도달했습니다.

어떤 아이디어가 잘못되었을 수 있습니까?

두 번째 질문 : 타이머를 사용하는 스레드라는 함수에 인수를 전달할 방법이 있습니까?

+0

[MCVE]를주십시오. 'CPUTIME'은 프로세스가 소비하는 CPU 시간을 나타냅니다 (분명한 사실을 말함). 프로그램이 무기한으로 잠자기 상태가되면 CPU 시간이 2.5 초에 도달하지 않습니다. 타이머를 설정 한 후에 프로그램이 무엇을하는지 알아야합니다. – kaylum

답변

2

@annamataris 문제는 spinlock 및 nanosleep 관련이 없습니다. CLOCK_REALTIME 만 사용해야하는 이유가 있습니다.

POSIX 타이머 시스템 호출은 Linux 2.6에서 처음 나타났습니다. 이전에는 glibc가 POSIX 스레드를 사용하여 불완전한 사용자 공간 구현 (CLOCK_REALTIME 타이머 만)을 제공했으며, glibc 2.17 이전 버전에서는 구현이 2.6 커널 이전 커널을 실행하는 시스템에서이 기술 으로 변경되었습니다. 추가 정보를

읽기 남자 timer_create.