Rumah >Tutorial sistem >LINUX >Antara muka pemasa yang paling berkuasa datang daripada siri jam POSIX, adakah anda tahu?

Antara muka pemasa yang paling berkuasa datang daripada siri jam POSIX, adakah anda tahu?

WBOY
WBOYke hadapan
2024-03-10 11:40:031149semak imbas

Soket pemasa yang paling berkuasa datang daripada siri jam POSIX Tindakan mencipta, memulakan dan memadam pemasa dibahagikan kepada tiga fungsi berbeza: timer_create() (create timer), timer_settime() (initialize timer) dan timer_delete (musnahkannya. ).

Buat pemasa:

<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid)</span>

Sesuatu proses boleh mencipta pemasa tertentu dengan memanggil timer_create(). Pemasa adalah unik untuk setiap proses dan tidak diwarisi apabila melakukan forking. clock_id menunjukkan jam yang mana pemasa berdasarkan, dan *timerid memuatkan ID pemasa yang dibuat. Fungsi ini mencipta pemasa dan memuatkan IDnya ke lokasi yang ditunjukkan oleh pemasa masa. Parameter evp menentukan pemberitahuan tak segerak untuk dijana apabila pemasa tamat tempoh. Jika evp adalah NULL, maka tamat tempoh pemasa akan menghasilkan isyarat lalai Untuk CLOCK_REALTIMER, isyarat lalai ialah SIGALRM. Jika anda ingin menjana isyarat selain daripada linux isyarat lalai, program mesti menetapkan evp->sigev_signo kepada nombor isyarat yang dikehendaki. Ahli evp->sigev_notify dalam struktur structsigevent menerangkan tindakan yang perlu diambil apabila pemasa tamat tempoh. Secara amnya, nilai ahli ini ialah SIGEV_SIGNAL, yang menunjukkan bahawa isyarat akan dijana apabila pemasa tamat tempoh. Program ini boleh menetapkan evp->sigev_notify ahli kepada SIGEV_NONE untuk mengelak daripada menjana isyarat apabila pemasa tamat tempoh.

Jika beberapa pemasa menjana isyarat yang sama, pengendali boleh menggunakan evp->sigev_value untuk mengenal pasti pemasa yang menghasilkan isyarat. Untuk melaksanakan fungsi ini, program mesti menggunakan pengecam SA_SIGINFO dalam ahli sa_flags structsigaction apabila memasang pengendali untuk isyarat.

nilai_id_jam adalah seperti berikut:

struct sigevent
{
<span>	</span>int sigev_notify; //notification type
<span>	</span>int sigev_signo; //signal number
<span>	</span>union sigval sigev_value; //signal value
<span>	</span>void (*sigev_notify_function)(union sigval);
<span>	</span>pthread_attr_t *sigev_notify_attributes;
}
union sigval
{
<span>	</span>int sival_int; //integer value
<span>	</span>void *sival_ptr; //pointer value
}

Sesuaikan tingkah laku selepas pemasa tamat tempoh dengan menetapkan evp->sigev_notify kepada nilai berikut:

Mulakan pemasa:

Pemasa yang dibuat oleh timer_create() belum dimulakan. Untuk mengaitkannya dengan masa tamat tempoh dan memulakan tempoh jam, gunakan timer_settime().

<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspect *ovalue);</span>

struct itimespec
{
struct timespec it_interval; 
struct timespec it_value; 
}; 

Sama seperti settimer(), it_value digunakan untuk menentukan masa tamat tempoh pemasa semasa. Apabila pemasa tamat tempoh, nilai it_value akan dikemas kini kepada nilai it_interval. Jika nilai it_interval ialah 0, pemasa bukan pemasa selang dan akan kembali ke keadaan tidak dimulakan sebaik sahaja it_value tamat tempoh. Struktur timespec menyediakan kadar kod peringkat milisaat:

struct timespec
{
time_t tv_sec;
long tv_nsec;
};

Jika nilai bendera ialah TIMER_ABSTIME, nilai masa yang ditentukan oleh nilai akan dihuraikan kepada nilai mutlak (kaedah penghuraian lalai untuk nilai ini adalah relatif kepada masa semasa). Tingkah laku yang berubah ini menghalang keadaan perlumbaan daripada disebabkan semasa mendapatkan masa semasa, mengira perbezaan relatif antara masa ini dan masa hadapan yang dikehendaki, dan pemasa permulaan.

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

Jika nilai ovalue bukan NULL, masa tamat tempoh pemasa sebelumnya akan disimpan dalam itimerspec yang disediakan. Jika pemasa tidak dimulakan sebelum ini, semua ahli struktur ini akan ditetapkan kepada 0.

Dapatkan baki masa pemasa aktif:

<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_gettime(timer_t timerid,struct itimerspec *value);</span>

Dapatkan bilangan larian larian pemasa:

有可能一个定时器到期了,而同一定时器上一次到期时形成的讯号还处于挂起状态。在这些情况下,其中的一个讯号可能会遗失。这就是定时器超限。程序可以通过调用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=masa_setmasa(pemasa,0,&ts,NULL);

jika(berkembali)

perror("masa_tetap masa");

sementara(1);

Contoh 2:

voidhandle(unionsigvalv)

masa_tt;

carp[32];

masa(&t);

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

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

kembali;

intmain()

structsigeventevp;

structitimerspects;

pemasa_masa;

intert;

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

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

evp.sigev_value.sival_ptr=&timer;

evp.sigev_notify=SIGEV_THREAD;

evp.sigev_notify_function=handle;

evp.sigev_value.sival_int=3;//作为handle()的参数

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

jika(berkembali)

perror("timer_create");

_sec=1;

_nsec=0;

_sec=3;

_nsec=0;

ret=masa_setmasa(pemasa,TIMER_ABSTIME,&ts,NULL);

jika(berkembali)

perror("masa_tetap masa");

sementara(1);

Atas ialah kandungan terperinci Antara muka pemasa yang paling berkuasa datang daripada siri jam POSIX, adakah anda tahu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:itcool.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam