网站建设哪公司好,做哪类视频网站需要视频牌照,主机服务器网站 怎么做,重庆公司注册核名查询系统信号的处理方式是远远比信号的产生当闹钟响了就知道时间到了#xff0c;说明对应信号处理方法比信号产生更早操作系统的信号处理方法在编写操作系统的时候就已经编写好了signal函数1.1所有的信号1.2 signal函数的概念和简单使用捕捉信号就是自定义对应的信号的处理方法9号信号…信号的处理方式是远远比信号的产生当闹钟响了就知道时间到了说明对应信号处理方法比信号产生更早操作系统的信号处理方法在编写操作系统的时候就已经编写好了signal函数1.1所有的信号1.2 signal函数的概念和简单使用捕捉信号就是自定义对应的信号的处理方法9号信号杀死进程不可以被捕捉因为如果被捕捉那么对应进程就是无敌的不能被杀死#includestdio.h
#includeunistd.h
#includesignal.hvoid headler(int signo)
{printf(signal NO.%d change\nsigno);
}
int main()
{signal(2,headler);//函数名不加就是一个函数指针while(1){printf(hello world pid: %d\n,getpid());sleep(1);}return 0;
}执行结果ctrlc发送二号信号二号信号默认是终止进程2.信号的产生方式2.1.键盘产生Ctrlc 2号信号Ctrl\ 3号信号Ctrlz 20号信号给对应进程发对应信号命令格式kill -信号编号 进程的pid2.2程序奔溃OS给进程发信号代码中有一个除零错误#includestdio.h
#includeunistd.h
#includesignal.h
void headler(int signo)
{printf(signal NO.%d change\n,signo);
}
int main()
{int i1;while(i31){//捕获“”所有”信号signal(i,headler);i;}int tem10;//除零错误tem/0;return 0;
}执行错误会发送一个8号信号2.3.系统调用kill给任意一个进程发任意信号raise给当前进程发信号2.4软件条件概念通过某种软件(OS),来触发信号的发送定时器或者某种操作达到条件不就绪等这样等场景来触发信号发送定时器或者某种操作达到条件不就绪比如管道的读端不写且关闭读端那么就会向写端发送SIGPIPE信号2.alarm定时器2.4.1.可以使用alarm证明CPU的计算速度远大于打印的速度1s中count计算打印了多少次#includestdio.h
#includeunistd.h
#includesignal.hint main()
{int count0;alarm(1);while(1){count;printf(count: %d\n,count);}return 0;
}1s中count计算会有多少次#includestdio.h
#includeunistd.h
#includesignal.h
int count0;
void handler(int signo)
{printf(count: %d\n,count);
}int main()
{alarm(1);signal(14,handler);while(1){count;}return 0;
}
执行结果可以证明CUP计算速度远大于打印速度3.OS如何识别信号实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)(接受到信号了但是还没有处理)进程可以选择阻塞 (Block )某个信号(保持这个信号为未决)识别信号先看block位图也叫信号屏蔽字是否被阻塞如果没有阻塞再看pending位图是否接收到信号如果接收到信号再看handler函数指针数组按SIG_DFL(默认)、SIG_IGN(忽略)、具体的函数指针就是自定义执行4.信号集操作函数4.1.sigset_t的接口sigset_t是一个位图结构#includesignal.hint sigemptyset(sigset_t *set);//初始化对象全为设为为0int sigfillset(sigset_t *set);//把所有信号置为1int sigaddset (sigset_t *set, int signo);//把几号信号为1int sigdelset(sigset_t *set, int signo);//把几号信号为0int sigismemberconst sigset_t *set, int signo); //判断是否有几号信号返回真1假04.2.sigprocmask 调用函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)。#includesignall.hint sigprocmask(int how, const sigset_t *set, sigset_t *oset); 返回值:若成功则为0,若出错则为-1 4.3.sigpending#includesignal.hsigpending(sigset_t* set);读取当前进程的未决信号集 4.4.简单使用#includestdio.h
#includeunistd.h
#includesignal.hvoid show(sigset_t* set)
{int i1;while(i32){if(sigismember(set,i))//信号为1则为真printf(1);elseprintf(0);i;}printf(\n);
}
int main()
{sigset_t iset,pending;sigemptyset(iset);//初始化sigaddset(iset,2);//添加2号信号sigprocmask(SIG_SETMASK,iset,NULL);//把信号屏蔽字改为isetwhile(1){sigemptyset(pending);//初始化sigpending(pending);//获取pending位图show(pending);sleep(1);}return 0;
}执行结果:屏蔽了2号信号2号信号是未决的5.信号的捕捉的全过程和信号的处理时机信号的处理时机从内核态返回到用户态做信号的检测并处理6.volatilevolatile:告诉编译器不要优化被volatile修饰的变量#includestdio.h
#includeunistd.h
#includesignal.h
#includeiostream
using namespace std;
int main()
{const int t10;int* pconst_castint*(t);*p20;printf(t: %d\n,t);printf(*p: %d\n,*p);return 0;
}执行结果t被const修饰编译器去t的值不会取内存中取volatile const int t10;//既可以解决7.SIGCHLD信号SIGCHLD当子进程退出会给父进程发17号信号SIGCHLD#includeunistd.h
#includesignal.h
#includeiostream
using namespace std;
void handler(int signo)
{coutsignoendl;coutgetpid()endl;
}
int main()
{signal(SIGCHLD,handler);if(fork()0){int cnt5;while(cnt){coutI am child process, getpid()endl;cnt--;sleep(1);}return 0;}while(1);
}可以使用下面代码替换上面的signal(SIGCHLD,handler);就可以做到在不需要子进程的退出信息时自动释放signal(SIGCHLD,SIG_IGN);