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

做可视化的网站建设银行网站一直打不开

做可视化的网站,建设银行网站一直打不开,网站 建设实验小结,推荐几个好看的网站目录 一#xff0c;信号内核表示 sigset_t sigprocmask sigpending 二#xff0c;捕捉信号 sigaction 三#xff0c;可重入函数 四#xff0c;volatile 五#xff0c;SIGCHLD 信号常见概念 实际执行信号的处理动作#xff0c;称为信号递达Delivery#xff1b;信…目录 一信号内核表示 sigset_t sigprocmask sigpending 二捕捉信号 sigaction 三可重入函数 四volatile 五SIGCHLD 信号常见概念 实际执行信号的处理动作称为信号递达Delivery信号从产生到递达的状态称为信号未决Pending进程可选择阻塞某个信号被阻塞的信号产生时将保持在未决状态直到进程解除对此信号的阻塞才会执行递达动作阻塞和忽略是不同的信号被阻塞就不会递达忽略是递达后可选的一种处理动作 一信号内核表示 每个信号都有两个标志阻塞、未决及一个函数指针表示的动作信号产生时内核在进程控制块中设置该信号的未决标志直到信号递达才清除该标志 SIGHUP信号未产生也未阻塞如递达时将执行默认动作SIGINT信号产生过但被阻塞暂时不能递达处理动作为忽略SIGQUIT信号未产生如产生将被阻塞处理动作为用户自定义函数如该信号在阻塞前产生多次POSIX允许系统递送该信号一次或多次Linux常规信号在递达前产生多次只计一次而实时信号在递达前产生多次可依次放在一个队列内 sigset_t 每个信号只有一个bit的未决标志0或1不记录该信号产生的次数阻塞标志也是如此未决和阻塞标志可用相同的数据类型sigset_t来存储sigset_t称为信号集该类型可表示每个信号的有效或无效 //信号集操作函数 //在使用sigset_t类型的变量之前一定要调用sigempty或sigfillset初始化以使信号集处于确定状态 //初始化后即可调用sigaddset和sigdelset在信号集中添加或删除某种有效信号 #include signal.h int sigemptyset(sigset_t* set) //初始化信号集使所有信号对应bit清零表示该信号集不包含任何有效信号 int sigfillset(sigset_t* set) //初始化信号集使所有信号对应bit清零表示该信号集的有效信号 int sigaddset(sigset_t* set, int signo) int sigdelset(sigset_t* set, int signo) int sigismember(const sigset_t* set, int signo) sigprocmask 此函数可读取或更改进程的信号屏蔽字阻塞信号集 #include signal.h int sigprocmask(int how, const sigset_t* set, sigset_t* oset); 如oset是非空指针则读取进程的当前信号屏蔽字通过oset参数传出如set是非空指针则更改进程的信号屏蔽字参数how指示如何更改如oset和set都是非空指针则先将原来的信号屏蔽字备份到oset然后根据set和how更改信号屏蔽字如当前信号屏蔽字为mask则下表说明了how参数的可选值 如调用此函数解除了对当前若干个未决信号的阻塞则在sigprocmask返回前至少将其中一个信号递达 sigpending 检测未决信号 #include signal.h int sigpending(sigset_t* set) #include iostream #include signal.h #include unistd.h using namespace std; void show_pending(sigset_t* pending){ for(int i1; i32; i){ if(sigismember(pending, i)) cout1; else cout0; } coutendl; } int main() { sigset_t in, out; sigemptyset(in); sigemptyset(out); sigaddset(in, 2); sigprocmask(SIG_SETMASK, in, out); int count0; sigset_t pending; while(1){ sigpending(pending); show_pending(pending); sleep(1); if(count10){ sigprocmask(SIG_SETMASK, out, in); //恢复2号信号后 2信号立即递达并执行默认操作 coutmy: ; show_pending(in); coutrecover default: ; show_pending(out); } count; } return 0; } [wz192 Desktop]$ g test.cpp -o test [wz192 Desktop]$ ./test 0000000000000000000000000000000 0000000000000000000000000000000 0000000000000000000000000000000 ^C0100000000000000000000000000000 0100000000000000000000000000000 0100000000000000000000000000000 0100000000000000000000000000000 0100000000000000000000000000000 0100000000000000000000000000000 0100000000000000000000000000000 0100000000000000000000000000000 二捕捉信号 如信号的处理动作是用户自定义函数在信号递达时就调用该函数称为捕捉信号由于信号处理函数的代码在用户空间处理过程比较复杂如用户程序注册了SIGQUIT信号的处理函数sighandler当前正在执行main函数此时发生中断或异常切换达到内核态在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达内核决定返回用户态后不是恢复main函数的上下文继续执行而是执行sighandler函数sighandler和main函数使用不同的堆栈空间不存在调用和被调用的关系是两个独立的控制流程sighandler函数返回后自动执行特殊的系统调用sigreturn再次进入内核态如没有新的信号递达再返回用户态就是恢复main函数的上下文继续执行 sigaction 当某个信号的处理函数被调用时内核自动将当前信号加入进程的信号屏蔽字当信号处理函数返回时自动恢复原来的信号屏蔽字这样就保证了在处理某个信号时如这种信号再次产生那么会被阻塞到当前处理结束为止 如在调用信号处理函数时除了当前信号被自动屏蔽之外还希望自动屏蔽另外一些信号则用sa_mask字段说明这些需要额外屏蔽的信号当信号处理函数返回时自动恢复原来的信号屏蔽字  #include iostream #include unistd.h #include signal.h #include stdlib.h using namespace std;void handler(int signo){coutget a signo: signoendl;exit(10); }int main(){struct sigaction act, oact;act.sa_handler handler;act.sa_flags 0;sigemptyset(act.sa_mask);//act.sa_restorer nullptr;//act.sa_sigaction nullptr;sigaction(SIGINT, act, oact);while(1){coutrunning...endl;sleep(1);}return 0; } 用户态内核态用户态需通过系统调用来访问内核数据调用系统调用时系统会自动切换 身份CPU会存在一个权限相关的寄存器数据标识所处状态每个用户进程都有自己的用户级页表而OS只有一份内核页表由于用户态和内核态的权限级别不同所能看到的资源也是不一样的 实时信号不会丢失会排队执行 三可重入函数 #include iostream #include unistd.h #include signal.h #include stdlib.h using namespace std;void show(int signo){int i0;while(i5){coutshow(), signo: signoendl;i;sleep(1);} }void handler(int signo){couthandler calling...endl;show(signo); }int main(){struct sigaction act, oact;act.sa_handler handler;act.sa_flags 0;sigemptyset(act.sa_mask);sigaction(SIGINT, act, oact);show(999);return 0; } [wz192 Desktop]$ ./test show(), signo: 999 show(), signo: 999 show(), signo: 999 ^Chandler calling... show(), signo: 2 show(), signo: 2 show(), signo: 2 show(), signo: 2 show(), signo: 2 show(), signo: 999 show(), signo: 999像以上insert插入函数被不同控制流调用可能在第一次调用还没返回时就再次进入该函数称为重入insert函数访问一个全局链表有可能因为插入而造成错乱像这样的函数称为不可重入函数反之如一函数只访问自己的局部变量或参数称为可重入函数所学的大部分函数都是不可重入的 如函数符合以下条件之一则是不可重入 调用了malloc或free因malloc也是也是用全局链表来管理堆的调用了标准I/O函数标准I/O库的很多实现都以不可重入的方式使用全局数据结构 四volatile C语言关键字保持内存的可见性 #include stdio.h #include signal.hint flag0; void handler(int signo){flag1;printf(handler calling, get signo: %d\n, signo); }int main(){signal(2, handler);while(!flag); //注意没有循环体printf(process quit normal!\n);return 0; } [wz192 Desktop]$ gcc -o test test.c [wz192 Desktop]$ ./test ^Chandler calling, get signo: 2 process quit normal!//优化级别1 [wz192 Desktop]$ gcc -o test test.c -O1 [wz192 Desktop]$ ./test ^Chandler calling, get signo: 2 ^Chandler calling, get signo: 2 ^Chandler calling, get signo: 2优化后flag被放在了CPU的寄存器当中while循环的flag并不是内存中的最新flag使用volatile关键字修饰变量后则该变量不允许在被优化对该该变量的任何操作都必须在真实的内存中进行 #include stdio.h #include signal.hvolatile int flag0; void handler(int signo){flag1;printf(handler calling, get signo: %d\n, signo); }int main(){signal(2, handler);while(!flag); //注意没有循环体printf(process quit normal!\n);return 0; } [wz192 Desktop]$ gcc -o test test.c -O1 [wz192 Desktop]$ ./test ^Chandler calling, get signo: 2 process quit normal!五SIGCHLD SIGCHLD是第17号信号进程wait、waitpid函数清理僵死进程父进程可阻塞等待子进程结束也可非阻塞查询是否有子进程结束等待清理轮询第一种方式父进程阻塞了就不能处理自己的工作第二种方式父进程在处理自己的工作同时还要记得轮询程序实现复杂 其实子进程在终止时会给父进程发送SIGCHLD信号该信号默认处理动作为忽略父进程可自定义SIGCHLD信号的处理函数这样父进程只需专心处理自己的工作不必关心子进程子进程终止时通知父进程父进程在信号处理函数中调用wait清理子进程即可 由于UNIX的历史原因要想不产生僵死进程还可在父进程调用sigaction时将SIGCHLD处理动作置为SIG_IGN这样fork出来的子进程在终止时会自动清理不会产生僵死进程也不会通知父进程系统默认的忽略动作和用户用sigaction函数自定义的忽略通常是没有区别的但这是特例此方法对于Linux可用但不保证在其他UNIX系统上都可使用 #include stdio.h #include stdlib.h #include unistd.h #include sys/wait.h #include signal.hvoid handler(int signo){printf(father get signo: %d\n, signo);pid_t id;//可能有多个子进程while((idwaitpid(-1,NULL,WNOHANG))0){printf(wait child success: %d\n, id);}printf(child is quit! %d\n, getpid()); }int main(){signal(SIGCHLD, handler);pid_t cid;if((cidfork()) 0){printf(child: %d\n, getpid());sleep(3);exit(1);}while(1){printf(father process...!\n);sleep(1); //可以提前被唤醒}return 0; } [wz192 Desktop]$ gcc -o test test.c [wz192 Desktop]$ ./test father process...! child: 99919 father process...! father process...! father get signo: 17 wait child success: 99919 child is quit! 99918 father process...! father process...! father process...! father process...!如不设置signal子进程终止时就会产生僵死进程 如设置为SIG_IGN子进程终止时自动清理 //如设置为忽略fork出来的子进程在终止时会自动清理不会产生僵死进程 signal(SIGCHLD, SIG_IGN); 等待子进程避免Z进程内存泄露可能需获取子进程的退出码父进程不关心子进程退出码可不wait如关心退出码必须wait
http://www.hkea.cn/news/14361421/

相关文章:

  • 网站登记表考虑了软件开发过程中的风险
  • 怎么快速建立一个网站搜索优化报价
  • 关于合肥的网站好怎么做网站盗号
  • 可以看电视剧的网站中国网站制作企业排行榜
  • 创建网站的软件什么梦如何做网站小编
  • 南通通明建设监理有限公司网站谷德设计网站
  • 网站建设的方案计划工程合同承包协议书完整版
  • 个人建设什么网站太原企业网站建设
  • 大兴企业网站建设自己开平台怎么弄啊
  • 电子商务网站建设的总体目标网站模版与模板的使用
  • modernize wordpressaso搜索排名优化
  • 汉川做网站黄页88网站推广怎么样
  • 我做网站价格网站建设带数据库模板
  • wordpress weixinseo的中文意思是什么
  • 忻州网络公司网站建设制作小程序和网站的公司
  • 网站开发 后端河间专业做网站电话
  • 网站建设全网推广小程序山东移动网站建设
  • 内部网站做域名解析到端口有专业设计网站吗
  • 章丘营销型网站设计公司天津seo招聘
  • 网站如何做sem优化如何对网站建设和维护
  • 百度做网站多少钱html网页 wordpress
  • 做网站图片教程营销网站建设评估及分析
  • 网站摄影设计江门网站推广技巧付费
  • 河南营销网站建设联系方式孝感房地产网站建设
  • 新网站百度有审核期南京建设工程质量监督站网站
  • 网站建设三站合一微信小程序域联网站建设
  • 东莞莞城网站建设公司青岛手机端建站模板
  • 郑州网站建设白杨网络小程序定制开发要多少钱
  • 用html制作网页seo销售是做什么的
  • 做网站不会写代码番禺建设银行网站