当前位置: 首页 > news >正文

河北网站建设排名wordpress无限加载

河北网站建设排名,wordpress无限加载,艺术作品欣赏网站,免费logo定制1.信号是什么#xff1f; 信号其实就是一个软件中断。 例#xff1a; 输入命令#xff0c;在Shell下启动一个前台进程。用户按下Ctrl-C#xff0c;键盘输入产生一个硬件中断。如果CPU当前正在执行这个进程的代码#xff0c;则该进程的用户空间代码暂停执行#xff0c;…1.信号是什么 信号其实就是一个软件中断。 例 输入命令在Shell下启动一个前台进程。用户按下Ctrl-C键盘输入产生一个硬件中断。如果CPU当前正在执行这个进程的代码则该进程的用户空间代码暂停执行 CPU从用户态切换到内核态处理硬件中断。终端驱动程序将Ctrl-C解释成一个SIGINT信号记在该进程的PCB中也可以说发送了一个SIGINT信号给该进程。当某个时刻要从内核返回到该进程的用户空间代码继续执行之前首先处理PCB中记录的信号发现有一个SIGINT信号待处理而这个信号的默认处理动作是终止进程所以直接终止进程而不再返回它的用户空间代码执行。 在这个例子中由ctrlc产生的硬件中断就是一个信号。CtrlC产生的信号只能发送给前台进程命令后加就可放到后台运行。 Shell可同时运行一个前台进程和任意多个后台进程只有前台进程才能接受到像CTRLC这种控制键产生的信号。 2.信号的种类 使用命令查看 kill -l非可靠信号1~31号信号信号可能会丢失 可靠信号34~64号信号信号不可能丢失 SIGHUP1号信号Hangup detected on controlling terminal or death of controlling process在控制终端上挂起信号或让进程结束ationterm SIGINT2号信号Interrupt from keyboard键盘输入中断ctrl c actionterm SIGQUIT3号信号Quit from keyboard键盘输入退出**ctrl |** actioncore产生core dump文件 SIGABRT6号信号Abort signal from abort(3)非正常终止double freeactioncore SIGKILL9号信号Kill signal杀死进程信号actionterm该信号不能被阻塞、忽略、自定义处理 SIGSEGV11号信号Invalid memory reference无效的内存引用解引用空指针、内存越界访问actioncore SIGPIPE13号信号Broken pipe: write to pipe with no readers管道中止: 写入无人读取的管道会导致管道破裂actionterm SIGCHLD17号信号Child stopped or terminated子进程发送给父进程的信号但该信号为忽略处理的 SIGSTOP19号信号Stop process停止进程actionstop SIGTSTP20号信号Stop typed at terminal终端上发出的停止信号ctrl zactionstop 具体的信号采取的动作和详细信息可查看man 7 signal 3.信号的产生 3.1硬件产生 硬件产生即通过终端按键产生的信号 ctrl cSIGINT(2)发送给前台进程 进程放到后台运行fg 把刚刚放到后台的进程再放到前台来运行ctrl zSIGTSTP(20)一般不用除非有特定场景ctrl | SIGQUIT(3)产生core dump文件 产生core dump文件的条件 当前OS一定不要限制core dump文件的大小ulimit -a 磁盘空间要足够 如何产生 3.1 解引用空指针收到11号信号产生core dump文件 3.2 内存访问越界程序一旦崩溃就会收到11号信号也就会产生core dump文件 3.3 double free收到6号信号并产生core dump。 3.4 freeNULL不会崩溃3.2软件产生 软件产生即调用系统函数向进程发信号 kill函数 #include sys/types.h #include signal.h int kill(pid_t pid, int sig); 参数解释 pid进程号 sig要发送的信号值 返回值成功返回0失败返回-1并设置错误kill命令kill -[信号] pidabortvoid abort(void);收到6号信号谁调用该函数谁就收到信号alarmunsigned int alarm(unsigned int seconds);收到14号信号告诉内核在seconds秒后给进程发送SIGALRM信号该信号默认处理动作为终止当前进程。 4.信号的注册 信号注册又分为可靠信号的注册和非可靠信号的注册。 信号注册实际上是一个位图和一个sigqueue队列。 4.1非可靠信号的注册 当进程收到非可靠信号时 将非可靠信号对应的比特位置为1添加sigqueue节点到sigqueue队列当中但是在添加sigqueue节点的时候队列当中已然有了该信号的sigqueue节点则不添加 4.2可靠信号的注册 当进程所受到可靠信号时 在sig位图中更改信号对应的比特位为1 不论之前sigqueue队列中是否存在该信号的sigqueue节点都再次添加sigqueue节点到sigqueue队列当中去 5.信号的注销 5.1非可靠信号的注销 信号对应的比特位从1置为0 将该信号的sigqueue节点从sigqueue队列当中进行出队操作 5.2可靠信号的注销 将该信号的sigqueue节点从sigqueue队列当中进行出队操作 需要判断sigqueue队列当中是否还有相同的sigqueue节点 ①没有了信号比特位从1置为0 ②还有不会更改sig位图中的比特位 6.信号阻塞 6.1信号是怎样阻塞的 信号的阻塞并不会干扰信号的注册。信号能注册但不能被立即处理 将block位图中对应的信号比特位置为1表示阻塞该信号 进程收到该信号还是一如既往的注册 当进程进入到内核空间准备返回用户空间的时候调用do_signal函数就不会立即去处理该信号了 当该信号不被阻塞后就可以进行处理了 6.2sigprocmask 函数原型int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 参数解释 how该做什么样的操作 SIG_BLOCK设置信号为阻塞 SIG_UNBLOCK解除信号阻塞 SIG_SETMASK替换阻塞位图 set用来设置阻塞位图 SIG_BLOCK设置某个信号为阻塞blocknew blockold | set SIG_UNBLOCK解除某个信号阻塞blocknew blockold ~set SIG_SETMASK替换阻塞位图blocknew set oldset原来的阻塞位图例下述例子信号全部被阻塞采用kill -9将该进程结束掉 #include stdio.h #include signal.h #include unistd.hvoid signcallback(int signumber) {printf(change the signal %d\n,signumber); }int main() {sigset_t set;sigset_t oldset;sigfillset(set);//所有比特位全置为1则信号全部会被阻塞sigprocmask(SIG_BLOCK,set,oldset);while(1){sleep(1);}return 0; } 结果 此时发送信号是不会有作用的采用kill -9强杀掉 7.信号未决 7.1 未决概念 实际执行信号的处理动作称为信号递达Delivery信号从产生到递达之间的状态称为信号未决Pending。 进程可以选择阻塞Block某个信号。被阻塞的信号产生时将保持在未决状态直到进程解除对此信号的阻塞才执行递达的动作。注意阻塞和忽略是不同的只要信号被阻塞就不会递达而忽略是、在递达之后可选的一种处理动作。 7.2 sigpending 函数原型int sigpending(sigset_t *set); 读取当前进程的未决信号集通过set参数传出。调用成功返回0出错返回-1. 例 #include stdio.h #include unistd.h #include signal.hvoid signalcallback(int signumber) {printf(chang signumber %d\n,signumber); } void printsigset(sigset_t *set) {int i 0;for(;i 32;i){if(sigismember(set,i)){putchar(1);}else{putchar(0);}} }int main() {signal(2,signalcallback);signal(10,signalcallback);sigset_t set;sigset_t oldset;sigset_t pending;sigfillset(set);//所有比特位全部置为1则信号会全部被阻塞sigprocmask(SIG_BLOCK,set,oldset);while(1){sigpending(pending);printsigset(pending);sleep(1);}return 0; } 结果 8.信号的处理方式 每个信号都有两个标志位分别表示阻塞和未决还有一个函数指针表示处理动作。在上述例子中 SIGHUP信号未阻塞也未产生过当它递达时执行默认处理动作。SIGINT信号产生过但正在被阻塞所以暂时不能递达。虽然它的处理动作是忽略但在没有解除阻塞之前不能忽略这个信号因为进程仍有机会改变处理动作之后再解除阻塞。SIGQUIT信号未产生过一旦产生SIGQUIT信号将被阻塞它的处理动作是用户自定义函数sighandler。 8.1signal函数 该函数可以更改信号的处理动作。 typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 参数解释signum更改的信号值 handler函数指针要更改的动作是什么实际上该函数内部也调用了sigaction函数。 8.2sigaction函数 读取和修改与指定信号相关联的处理动作。 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);参数解释 signum待更改的信号值struct sigaction结构体 void (*sa_handler)(int);//函数指针保存了内核对信号的处理方式 void (*sa_sigaction)(int, siginfo_t *, void *);// sigset_t sa_mask;//保存的是当进程在处理信号的时候收到的信号 int sa_flags;//SA_SIGINFOOS在处理信号的时候调用的就是sa_sigaction函数指针当中 //保存的值0在处理信号的时候调用sa_handler保存的函数 void (*sa_restorer)(void); 例 #include stdio.h #include unistd.h #include signal.hvoid signcallback(int signumber) {printf(change signumber %d\n,signumber); }int main() {struct sigaction act;//act为入参sigemptyset(act.sa_mask);act.sa_flags 0;act.sa_handler signcallback;struct sigaction oldact;//oldact为出参sigaction(3,act,oldact);while(1){sleep(1);}return 0; }结果 8.3 自定义信号处理的流程 task_struct结构体中有一个struct sighand_struct结构体。struct sighand_struct结构体有一个**struct k_sigaction action[_NSIG]**结构体数组。该数组中其中的**_sighandler_t sa_handler**保存的是信号的处理方式通过改变其指向可以实现我们对自定义信号的处理。 9.信号的捕捉 9.1信号捕捉的条件 如果信号的处理动作是用户自定义函数在信号递达时就调用这个函数这就称为信号捕捉。 9.2信号捕捉流程 内核态返回用户态会调用do_signal函数两种情况 无信号sys_return函数返回用户态 有信号先处理信号信号返回再调用do_signal函数 例 程序注册了SIGQUIT信号的处理函数sighandler。 当前正在执行main函数这时发生中断或异常切换到内核态。 在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达。 内核决定返回用户态后不是恢复main函数的上下文继续执行而是执行sighandler函数 sighandler和main函数使用不同的堆栈空间它们之间不存在调用和被调用的关系是两个独立的控制流程。 sighandler函数返回后自动执行特殊的系统调用sigreturn再次进入内核态。 如果没有新的信号要递达这次再返回用户态就是恢复main函数的上下文继续执行了。 10.常用信号集操作函数 int sigemptyset(sigset_t *set);//将比特位图全置为0int sigfillset(sigset_t *set);//将比特位图全置为1int sigaddset(sigset_t *set, int signum);//将该set位图多少号信号置为1int sigdelset(sigset_t *set, int signum);//将该set位图多少号信号置为0int sigismember(const sigset_t *set, int signum);//信号signum是否是set位图中的信号11.SIGCHLD信号 该信号是子进程在结束是发送给父进程的信号但是该信号的处理方式是默认处理的。 父进程对子进程发送过来的SIGCHLD信号进行了忽略处理就会导致子进程成为僵尸进程。 可以自定义该信号的处理方式 #include stdio.h #include unistd.h #include signal.h #include string.h #include sys/wait.h #include stdlib.hvoid signcallback(int signumber) {printf(change signal %d\n,signumber);wait(NULL); }int main() {signal(17,signcallback);pid_t pid fork();if(pid 0){perror(fork);return -1;}else if(pid 0){printf(I am child\n);sleep(1);exit(12);}else{while(1){sleep(1);}}return 0; } 指令查看后台ps aux | grep ./fork 原文地址 https://blog.csdn.net/w903414/article/details/109802539?utm_sourceappapp_version4.18.0utm_sourceapp
http://www.hkea.cn/news/14321142/

相关文章:

  • 网站免费虚拟主机申请摄影师做展示的网站
  • 实验室建设网站沐风seo
  • it之家网站源码哪个网站 的域名最便宜
  • 大同网站建设熊掌号内在空间官网
  • 如何管理公司网站后台wordpress 网页缩放
  • 网站开发与维护的工资wordpress导航栏的文件在哪
  • 百度网站下拉怎么做的怎么创建网站相册
  • 微端网站开发wordpress备案信息代码
  • 万网制作网站怎么样网站 asp.net php
  • 网站seo的主要优化内容免费的网站推荐下载
  • 什么网站可以做字体效果好影楼网站推广
  • 黑群晖做网站一站式做网站费用
  • 企业网站建设公司名称做百度百科的网站
  • 网站是什么?网站外链建设是什么
  • 上网站乱码武义县建设局网站首页
  • 农机局网站建设总结网站建设制作一个网站的费用
  • 包头网站建设平台广和wordpress集成dz
  • 网站开发外包wordpress theme 检测
  • 网站做调查问卷给钱的兼职网站建设与制作培训通知
  • 网站推广服务网址网页设计与制作 教学效果
  • 对于协会的新年祝贺语网站模板wordpress后台设置
  • 网站 首页 关键词网站后台怎么更新网站
  • 有关天猫网站开发的论文盐城网站开发市场
  • 建设银行梅李分行网站家庭电脑可以做网站吗
  • 精品建设课程网站qq刷赞网站推广快速
  • 网站建设需要了解的淘宝客做的最好的网站
  • 申请免费网站公司安徽建设厅证书查询网网站
  • 青岛网站建设 上流合作建设网站协议
  • 酒店网站建设的重要性是想建个网站 用本地做服务器
  • 网站建设公司帮企业建站的目的珠海横琴建设局网站