其他定时函数
raise函数
raise函数:int raise(int sig)
功能:给当前进程发送指定信号(自己给自己发信号),raise(signo)相当于kill(getpid(),signo)
返回值:成功返回0;失败返回非0值
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
int main(int argc,char* argv[]){
sleep(5);
printf("等待5s后自杀\n");
raise(SIGKILL);
while(1);
return 0;
}
结果:
haitu@ubuntu:/opt/linux_test/signal/signal1$ ./arise
等待5s后自杀
已杀死
abort函数
abort函数:void abort(void)
功能:给自己发送异常终止信号6:SIGABRT信号,并终止产生core文件
返回值:无
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
int main(int argc,char* argv[]){
sleep(5);
printf("等待5s后自杀\n");
abort();
while(1);
return 0;
}
结果:
haitu@ubuntu:/opt/linux_test/signal/signal1$ ./abort
等待5s后自杀
已放弃 (核心已转储)
信号集操作函数
sigset_t set;
sigemptyset(sigset_t *set);
sigfillset(sigset_t *set);
sigaddset(sigset_t *set, int signum);
sigdelset(sigset_t *set,int signum);
sigismember(sigset_t *set, int signum);
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset);
how:
SIG_BLOCK: 设置阻塞
SIG_UNBLOCK: 取消阻塞
SIG_SETMASK: 用自定义 set 替换 mask。
set: 自定义 set
oldset:传出参数,旧有的 mask。
int sigpending(sigset_t *set)
set: 传出参数(未决信号集)。
信号操作集test测试
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
#include <sys/mman.h>
#include <errno.h>
#include <signal.h>
void print_set(sigset_t *set)
{
int i = 0;
for(;i<32;i++){
if(sigismember(set,i)){
printf("1");
}else{
printf("0");
}
}
printf("\n");
}
void sys_error(const char* string1){
perror(string1);
exit(1);
}
int main(int argc,char* argv[]){
sigset_t set;
sigset_t oldset;
sigset_t pdset;
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigaddset(&set, SIGQUIT);
sigaddset(&set, SIGBUS);
sigaddset(&set, SIGKILL);
int ret = sigprocmask(SIG_BLOCK,&set,&oldset);
if(ret == -1){
sys_error("sigprocmask error");
}
int ret1 = 0;
while(1){
ret1 = sigpending(&pdset);
if(ret1 == -1){
sys_error("sigpending error");
}
print_set(&pdset);
sleep(1);
}
return 0;
}
测试结果
haitu@ubuntu:/opt/linux_test/signal/signal2$ ./sigset
10000000000000000000000000000000
10000000000000000000000000000000
10000000000000000000000000000000
10000000000000000000000000000000
^C10100000000000000000000000000000
10100000000000000000000000000000
10100000000000000000000000000000
10100000000000000000000000000000
信号操作集函数的使用原理
haitu@ubuntu:/opt/linux_test/signal/signal2$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
sigprocmask:
通过自定义的信号集set,用来和PCB中的mask信号屏蔽字进行位与、位或、取反位与等操作,用来改变mask信号屏-蔽字的位图状态。就可以实现阻塞、未阻塞等操作,当使用该种信号的时候,那么就会阻塞,那么未决信号集对应的位图位置也就会被置为1。