2014-05-24 5 views
1

evp 매개 변수를 설정할 수 없지만 NULL으로 설정 한 것처럼 타이머 처리기에 timerid을 수신하고 싶습니다.timer_create 및 timerid가 허용됩니까?

struct sigevent se; 
se.sigev_notify = SIGEV_THREAD; 
se.sigev_notify_attributes = {}; 
se.sigev_notify_function = timer_handler; 

timer_create(CLOCK_MONOTONIC, &se, &se.sigev_value); 

작동 여부와 상관없이 확실하지 않습니다. 타이머 처리기에서 timerid을 얻는 다른 방법이 evpNULL으로 설정하지 않고 있습니까?

답변

0

timer_tint보다 길 수 있기 때문에 이것은 분명히 유효하지 않습니다. 또한 포인터를 공용체에 전달하는 것은 해당 멤버 중 하나에 포인터를 전달하는 것과 동일하지 않습니다.

당신은 같은 것을 할 필요가 :

timer_t timerid; 
struct sigevent se = { 0 }; 
se.sigev_notify = SIGEV_THREAD; 
se.sigev_value.sival_ptr = &timerid; 
se.sigev_notify_function = timer_handler; 

if (timer_create(CLOCK_MONOTONIC, &se, &timerid) < 0) 
    abort(); // or whatever 

// later... 
if (timer_delete(timerid) < 0) 
    abort(); 

, 당신은 timerid을 잡고, 당신의 sigevent 구조에서 그것을 멀리 포인터 다람쥐, 타이머를 삭제하는 기억 공간을 할당해야 당신이 그것을 끝내면.

또한 항상 시스템 호출에 오류가 있는지 확인하고 아무 일도 일어나지 않은 것처럼 진행해야합니다.

+0

당신의 예제에서'timerid'를 static으로 만들어야한다고 생각합니다. 그렇지 않으면'sival_ptr'이 매달릴 것입니다. – user1095108

관련 문제