深入理解linux setitimer函数
在Linux系统中,setitimer函数是一种很重要的系统调用函数。它主要用于设置定时器,以便在程序运行时按照指定的时间间隔执行任务。本文将探讨setitimer函数的使用方法、参数含义以及内部实现原理,帮助读者更深入地理解这个函数。
1. setitimer函数的定义
setitimer函数是一个系统调用函数,其主要作用是设置定时器。该函数定义在头文件中,具体语法如下:
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
其中,which参数用于指定要设置的定时器类型,可以为:
– ITIMER_REAL:用于处理真实时间。
– ITIMER_VIRTUAL:用于处理进程占用的CPU时间。
– ITIMER_PROF:用于处理进程以及它的子进程使用的CPU时间。
new_value参数用于设置新的时间间隔, old_value用于指定旧的时间间隔。如果旧的时间间隔不再需要,可以将其值设为NULL。
2. setitimer函数的参数含义
在使用setitimer函数时,需要了解其参数的含义。下面是对每个参数的解释:
a) which参数
which参数指定了要设置的定时器类型。在Linux系统中,共有三种定时器类型,分别为ITIMER_REAL、ITIMER_VIRTUAL和ITIMER_PROF。
其中,ITIMER_REAL用于处理真实时间,这种情况下如果定时器时间到了,内核会向进程发送SIGALRM信号。该信号可以被捕获并对其进行处理。
ITIMER_VIRTUAL用于处理进程占用的CPU时间。每次进程运行时,进程占用的CPU时间都会被累加到ITIMER_VIRTUAL定时器中,当定时器时间到了,内核也会向进程发送SIGVTALRM信号。
ITIMER_PROF用于处理进程以及它的子进程使用的CPU时间。每次进程或其子进程运行时,占用的CPU时间都会被累加到ITIMER_PROF定时器中。当定时器时间到了,内核会向进程发送SIGPROF信号。
b) new_value参数
new_value参数用于设置新的时间间隔,以及定时器的一个初始值。该参数是一个指向itimerval结构体的指针,该结构体的定义如下:
struct itimerval {
struct timeval it_interval; /* timer interval */
struct timeval it_value; /* current value */
};
在该结构体中,it_interval成员用于表示定时器时间间隔,it_value则表示定时器的初始值。其中,it_interval和it_value都是一个timeval结构体类型的值。
timeval结构体的定义如下:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
该结构体成员tv_sec用于表示秒数,tv_usec用于表示微秒数。
c) old_value参数
old_value参数用于保存旧的时间间隔。该参数是一个指向itimerval结构体的指针。
3. setitimer函数的使用示例
下面是一个简单的示例,演示如何使用setitimer函数实现定时器功能。
在本例中,我们使用ITIMER_REAL定时器,每隔三秒钟向标准输出打印一句“Hello, World!”。代码如下:
#include
#include
#include
#include
#include
/* SIGALRM信号处理函数 */
void handler(int sig)
{
printf(“Hello, World!\n”);
}
int mn()
{
struct itimerval value;
/* 设置定时器时间间隔 */
value.it_value.tv_sec = 3;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 3;
value.it_interval.tv_usec = 0;
/* 注册信号处理函数 */
if(signal(SIGALRM, handler) == SIG_ERR)
{
perror(“signal error”);
exit(EXIT_FLURE);
}
/* 开始计时 */
if(setitimer(ITIMER_REAL, &value, NULL) == -1)
{
perror(“setitimer error”);
exit(EXIT_FLURE);
}
/* 运行程序 */
while(1);
return 0;
}
在本例中,首先定义了一个setitimer结构体变量value,用于设置时间间隔,以及定时器的初始值。
接着,我们注册了一个信号处理函数,用于处理SIGALRM信号。当定时器时间到了,内核会向进程发送该信号。
然后,使用setitimer函数开始计时。这时,ITIMER_REAL定时器开始工作,每隔3秒钟就会向进程发送一个SIGALRM信号。
我们在程序中使用了一个无限循环,确保程序一直保持运行状态。
当我们运行这个程序时,我们可以看到每隔三秒钟,屏幕上就会出现一句“Hello, World!”。
4. setitimer函数的内部实现原理
在Linux系统中,setitimer函数的内部实现方式比较复杂。当我们使用setitimer函数时,实际上是在向内核发送一个SIGALRM、SIGVTALRM或SIGPROF信号,并设置该信号的处理方式。
在Linux内核中,SIGALRM、SIGVTALRM和SIGPROF信号都有一个相应的处理函数。当该信号被触发时,内核会调用该信号的处理函数。在内核中,定义了一个全局的定时器链表,用来存储所有的定时器。
在进行setitimer函数调用时,内核会将定时器信息加入到该链表中。定时器调用的顺序是按照定时器时间顺序排列的,因此,当一个定时器时间到了,内核会找到定时器链表中最早的定时器,并将该定时器的信息从链表中移除,然后触发相应的信号。
当进程收到相应的信号时,内核会根据信号处理函数来处理该信号。在处理SIGALRM信号时,一般是通过alarm或setitimer函数来实现的。
5.
成都网站建设公司-创新互联为您提供网站建设、网站制作、网页设计及定制高端网站建设服务!
那就什么也没有发生啊。
对于这个信号而言,没有信号响应函数的话,进程应该会异常终止,对于系统已有的信号一般都是有默认处理的,具体的我有点记不得了,搜下其实就知道了.我在网上找了下各信号默认处理方式,你看看吧,对你有没有用
信号名称 信号说明 默认处理
SIGABRT 由程序调用 abort时产生该信号。程序异常结束。 进程终止并且产生core文件
SIGALRM timer到期,有alarm或者setitimer 进程终止
SIGBUS 总线错误,地址没对齐等。取决于具体硬件。 结束终止并产生core文件
SIGCHLD 进程停止或者终止时,父进程会收到该信号。 忽略该信号
SIGCONT 让停止的进程继续执行继续执行或者忽略
SIGFPE 算术运算异常,除0等。进程终止并且产生core文件。
SIGHUP 终端关闭时产生这个信号 进程终止
SIGILL 代码中有非法指令 进程终止并产生core文件
SIGINT 终端输入了中断字符ctrl+c进程终止
SIGIO 异步I/O,跟SIGPOLL一样。 进程终止
SIGIOT 执行I/O时产生硬件错误 进程终止并且产生core文件
SIGKILL 这个信号用户不能去捕捉它。 进缓盯程终止
SIGPIPE 往管道写时,读者已经不在了,或者往一个已断开
数据流
socket写数据。 进程终止
SIGPOLL 异步I/O,跟SIGIO一样。 进程终止
SIGPROF 有setitimer设置的timer到期引发 。 进程终止
SIGPWR Ups电源切换时 进程终止
SIGQUIT Ctrl+\,不同于SIGINT,这个是会产生core dump文件的。 进伏悔程终止并且产生core文件
SIGSEGV 内扰厅和存非法访问,默认打印出segment fault 进程终止并且产生core文件
SIGSTOP 某个进程停止执行,该信号不能被用户捕捉。 进程暂停执行
SIGSYS 调用操作系统不认识的系统调用。 进程终止并且产生core文件
SIGTERM 有kill函数调用产生。 进程终止
SIGTRAP 有调试器使用,gdb 进程终止并且产生core文件
SIGTSTP Ctrl+z,挂起进程。 进程暂停
SIGTTIN 后台程序要从终端读取成数据时。 进程暂停
SIGTTOU 后台终端要把数据写到终端时。 进程暂停
SIGURG 一些紧急的事件,比如从网络收到带外数据。 忽略
SIGUSR1 用户自定义信号 进程终止
SIGUSR2 用户自定义信号 进程终止
SIGVTALRM 有setitimer产生。 进程终止
用setTimeout函数的时候会有一个梁兆升返回的id,你可以用一个id记录一个setTimeout。id=setTimeout(“这里写你的函猜岩数”,1000);然后当你不用的时橡老候可以clearTimeout(id)释放这个timer。
关于linux setitimer的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
四川成都云服务器租用托管【创新互联】提供各地服务器租用,电信服务器托管、移动服务器托管、联通服务器托管,云服务器虚拟主机租用。成都机房托管咨询:13518219792
创新互联(www.cdcxhl.com)拥有10多年的服务器租用、服务器托管、云服务器、虚拟主机、网站系统开发经验、开启建站+互联网销售服务,与企业客户共同成长,共创价值。
文章名称:「深入理解Linuxsetitimer函数」(linuxsetitimer)
本文来源:http://www.shufengxianlan.com/qtweb/news7/475157.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联