Linux 信号详解三(sleep,raise)
sleep()函数 1.sleep()函数作用:让进程睡眠 2.能被未忽略的信号打断,然后处理信号函数以后,就不再睡眠,直接向下执行代码 3.sleep函数的返回值是剩余秒数
//sleep 函数 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> void catch_signal(int sign) { switch(sign) { case SIGINT: printf("accept signal!\n"); break; default: break; } } int main(int arg,char *args[]) { //注册信号 if(signal(SIGINT,catch_signal)==SIG_ERR) { perror("signal error"); return-1; } int num=0; num=sleep(100); //手动执行 ctrl+C 进程被唤醒 if(num>0) { printf("sleep()函数被打算睡眠,醒过来了!\n"); } //说明:sleep()函数是可中断睡眠 printf("新的测试!\n"); //再次设计sleep()函数,让其sleep需要的时间 num=15; do{ num=sleep(num); printf("被唤醒了,但是还要继续睡眠!剩余时间%d\n",num); }while(num); printf("game over!\n"); return 0; }
int raise(int sig) --给自己发送信号,raise(sig)等价于kill(getpid(),sig) killpg --给进程组发送信号,killpg(pgrp,sig)等价于kill(-pgrp,sig) sigqueue --给进程发送信号,支持排队,可以附带信息
sleep() makes the calling thread sleep until seconds seconds have elapsed or a signal arrives which is not ignored.
sleep使线程沉睡,直到X秒——或者有一个未被忽略的信号到达
sleep() may be implemented using SIGALRM; mixing calls to alarm(2) and sleep() is a bad idea.
sllep函数可能是用SIGALRM来实现的,混合调用alarm和sleep可不是个好主意。
Using longjmp(3) from a signal handler or modifying the handling of SIGALRM while sleeping will cause undefined results.
在sleep期间修改SIGALRM的处理会导致未知错误