|
原型:
#include <time.h> int nanosleep(const struct timespec *req, struct timespec *rem);
说明: 此函数将调用进程挂起,直到 req 里所指的时间结束。req 是 struct timespec 结构体的指针。struct timespec 结构体定义如下:
struct timespec { time_t tv_sec; /* 秒 */ long tv_nsec; /* 纳秒 */ };
如果在调用 nanosleep() 睡眠期间被信号所中断,nanosleep() 就会返回 -1,同时设置 errno 为 EINTR,并且会将剩余的时间写入由 rem 所指向同样时 struct timespec 类型的结构体中,如果 rem 为 NULL,就不会记录剩余时间。当信号处理完毕时,还会继续调用 nanosleep() 直到剩余时间用完为止。
测试程序:
#include <stdio.h> #include <time.h> #include <signal.h> #include <errno.h>
void sigfunc (int sig_no) { int temp = 1000; while (temp-- > 0) ; }
int msleep (unsigned long milisec, int temp) { struct timespec req = {0}, rem = {0}; time_t sec = (int)(milisec / 1000); milisec = milisec - (sec * 1000); req.tv_sec = sec; /*秒*/ req.tv_nsec = milisec * 1000000L; /*纳秒*/ while (nanosleep (&req, &req) == -1 && errno == EINTR) { printf ("测试-%d被信号中断,剩余时间为: %ld秒%ld纳秒
", temp, req.tv_sec, req.tv_nsec); continue; } return (1); }
int main() { struct sigaction sa = {0}; sa.sa_handler = &sigfunc; sigaction (SIGINT, &sa, NULL); //安装信号处理函数
unsigned long a = 0; int temp = 1; scanf ("%ld", &a);
for (;;) { if (a == 5) { printf ("testing-%d
", temp); msleep (a*1000, temp); //将 nanosleep() 封装在 msleep() 中 temp++; } else usleep (1000000); } return (1); }
运行与输出:
$ ./nanosleep 5 testing-1 testing-2 ^C测试-2被信号中断,剩余时间为: 4秒120263116纳秒 ^C测试-2被信号中断,剩余时间为: 3秒440359866纳秒 ^C测试-2被信号中断,剩余时间为: 2秒320431341纳秒 ^C测试-2被信号中断,剩余时间为: 1秒320495448纳秒 testing-3 ... ...
上面,^C 表示按下 Ctrl + c 组合键,发出中断函数信号。 |
from:http://www.groad.net/bbs/thread-2621-1-1.html
|