>  기사  >  시스템 튜토리얼  >  가장 강력한 타이머 인터페이스는 POSIX 시계 시리즈에서 나옵니다. 알고 계셨나요?

가장 강력한 타이머 인터페이스는 POSIX 시계 시리즈에서 나옵니다. 알고 계셨나요?

WBOY
WBOY앞으로
2024-03-10 11:40:031110검색

가장 강력한 타이머 소켓은 POSIX 시계 시리즈에서 비롯됩니다. 타이머 생성, 초기화 및 삭제 작업은 세 가지 다른 함수로 나뉩니다. ).

타이머 만들기:

으아악

프로세스는 타이머_create()를 호출하여 특정 타이머를 생성할 수 있습니다. 타이머는 각 프로세스마다 고유하며 포크할 때 상속되지 않습니다. clock_id는 타이머가 어떤 시계를 기반으로 하는지를 나타내고, *timerid는 생성된 타이머의 ID를 로드합니다. 이 함수는 타이머를 생성하고 해당 ID를 timerid가 가리키는 위치에 로드합니다. evp 매개변수는 타이머가 만료될 때 생성될 비동기 알림을 지정합니다. evp가 NULL이면 타이머 만료로 인해 CLOCK_REALTIMER의 경우 기본 신호는 SIGALRM입니다. 기본 신호 linux 이외의 신호를 생성하려는 경우 프로그램은 evp->sigev_signo를 원하는 신호 번호로 설정해야 합니다. structsigevent 구조의 evp->sigev_notify 멤버는 타이머가 만료될 때 취해야 하는 작업을 설명합니다. 일반적으로 이 멤버의 값은 SIGEV_SIGNAL이며 이는 타이머가 만료되면 신호가 생성됨을 나타냅니다. 프로그램은 타이머가 만료될 때 신호 생성을 방지하기 위해 evp->sigev_notify 멤버를 SIGEV_NONE으로 설정할 수 있습니다.

여러 타이머가 동일한 신호를 생성하는 경우 핸들러는 evp->sigev_value를 사용하여 어떤 타이머가 신호를 생성했는지 식별할 수 있습니다. 이러한 기능을 구현하려면 프로그램은 신호에 대한 처리기를 설치할 때 structsigaction의 sa_flags 멤버에서 SA_SIGINFO 식별자를 사용해야 합니다.

clock_id 값은 다음과 같습니다:

으아악

evp->sigev_notify를 다음 값으로 설정하여 타이머가 만료된 후 동작을 사용자 정의하세요.

타이머 시작:

timer_create()로 생성된 타이머가 시작되지 않았습니다. 만료 시간 및 시작 시계 기간과 연결하려면 타이머_settime()을 사용하세요.

으아악

으아악

settimer()와 마찬가지로 it_value는 현재 타이머 만료 시간을 지정하는 데 사용됩니다. 타이머가 만료되면 it_value 값이 it_interval 값으로 업데이트됩니다. it_interval 값이 0이면 타이머는 간격 타이머가 아니며 it_value가 만료되면 시작되지 않은 상태로 돌아갑니다. timespec의 구조는 밀리초 수준의 코드 속도를 제공합니다.

으아악

flags 값이 TIMER_ABSTIME인 경우 value로 지정된 시간 값은 절대값으로 구문 분석됩니다(이 값에 대한 기본 구문 분석 방법은 현재 시간을 기준으로 합니다). 이렇게 변경된 동작은 현재 시간 검색, 현재 시간과 원하는 미래 시간 간의 상대적인 차이 계산 및 타이머 시작 중에 경쟁 조건을 방지합니다.

定时器程序设计实验报告_linux 定时器程序_定时器程序编写

ovalue 값이 NULL이 아닌 경우 제공된 itimerspec에 이전 타이머 만료 시간이 저장됩니다. 타이머가 이전에 시작되지 않은 경우 이 구조의 모든 멤버는 0으로 설정됩니다.

활성 타이머의 남은 시간 확인:

으아악

타이머의 오버런 실행 횟수를 알아보세요:

有可能一个定时器到期了,而同一定时器上一次到期时形成的讯号还处于挂起状态。在这些情况下,其中的一个讯号可能会遗失。这就是定时器超限。程序可以通过调用timer_getoverrun来确定一个特定的定时器出现这些超限的次数。定时器超限只能发生在同一个定时器形成的讯号上。由多个定时器linux 定时器程序,甚至是这些使用相同的时钟和讯号的定时器,所形成的讯号就会排队而不会遗失。

<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_delete (timer_t timerid);</span>

执行成功时,timer_getoverrun()会返回定时器初次到期与通知进程(比如通过讯号)定时器已到期之间额外发生的定时器到期次数。举例来说linux 定时器程序,在我们之前的事例中,一个1ms的定时器运行了10ms,则此调用会返回9。假如超限运行的次数等于或小于DELAYTIMER_MAX,则此调用会返回DELAYTIMER_MAX。

执行失败时,此函数会返回-1并将errno设定会EINVAL,这个惟一的错误情况代表timerid指定了无效的定时器。

删掉一个定时器:

<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_delete (timer_t timerid);</span>

一次成功的timer_delete()调用会销毁关联到timerid的定时器而且返回0。执行失败时,此调用会返回-1并将errno设定会EINVAL,这个惟一的错误情况代表timerid不是一个有效的定时器。

例1:

voidhandle()

time_tt;

charp[32];

time(&t);

strftime(p,sizeof(p),"%T",localtime(&t));

printf("timeis%s/n",p);

intmain()

structsigeventevp;

structitimerspects;

timer_ttimer;

intret;

evp.sigev_value.sival_ptr=&timer;

evp.sigev_notify=SIGEV_SIGNAL;

evp.sigev_signo=SIGUSR1;

定时器程序设计实验报告_定时器程序编写_linux 定时器程序

signal(SIGUSR1,handle);

ret=timer_create(CLOCK_REALTIME,&evp,&timer);

if(ret)

perror("timer_create");

_sec=1;

_nsec=0;

_sec=3;

_nsec=0;

ret=timer_settime(타이머,0,&ts,NULL);

if(ret)

오류("timer_settime");

동안(1);

예2:

voidhandle(unionsigvalv)

time_tt;

charp[32];

시간(&t);

strftime(p,sizeof(p),"%T",localtime(&t));

printf("%sthread%lu,val=%d,signalcaptured./n",p,pthread_self(),v.sival_int);

반품;

intmain()

structsigeventevp;

구조적 측면;

timer_ttimer;

소개;

memset(&evp,0,sizeof(evp));

定时器程序设计实验报告_linux 定时器程序_定时器程序编写

evp.sigev_value.sival_ptr=&timer;

evp.sigev_notify=SIGEV_THREAD;

evp.sigev_notify_function=처리;

evp.sigev_value.sival_int=3;//작성handle()적参数

ret=timer_create(CLOCK_REALTIME,&evp,&timer);

if(ret)

오류("timer_create");

_sec=1;

_nsec=0;

_sec=3;

_nsec=0;

ret=timer_settime(timer,TIMER_ABSTIME,&ts,NULL);

if(ret)

오류("timer_settime");

동안(1);

위 내용은 가장 강력한 타이머 인터페이스는 POSIX 시계 시리즈에서 나옵니다. 알고 계셨나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 itcool.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제