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

烟台放心的一站式网站建设wap网络

烟台放心的一站式网站建设,wap网络,在线电子商务网站开发,wordpress只能进首页前言#xff1a; signal 是一种通信机制#xff0c;可以跨进程发送#xff0c;可以同进程跨线程发送#xff0c;可以不同进程向指定线程发送。 信号的创建有两套api#xff0c;一个是signal#xff0c;一个是sigaction#xff0c;signal缺陷很多#xff0c;比如没有提…前言 signal 是一种通信机制可以跨进程发送可以同进程跨线程发送可以不同进程向指定线程发送。 信号的创建有两套api一个是signal一个是sigactionsignal缺陷很多比如没有提供触发后自动再次设置处理信号处理策略这会导致连续触发的两个信号一个进入了期待的信号处理流程另外一个则进入了默认的信号处理流程。 信号的递送和接受处理是异步的即信号发送者不会因为信号接收者使用了阻塞信号处理函数而被阻塞住。但是信号的递送可能会出现阻塞这个阻塞发生在信号发送者把信号送入内核的信号队列中(需要从代码层面验证)。 信号处理方式 信号的处理有三种方式默认忽略信号处理函数可以在使用 sigaction 创建信号处理策略时指定。 默认分为如下几种        Term   Default action is to terminate the process.        Ign    Default action is to ignore the signal.        Core   Default action is to terminate the process and dump core (see core(5)).        Stop   Default action is to stop the process.        Cont   Default action is to continue the process if it is currently stopped. 不同信号的默认行为如下        Signal      Standard   Action   Comment  ────────────────────────────────────────────────────────────────────────        SIGABRT      P1990      Core    Abort signal from abort(3)        SIGALRM      P1990      Term    Timer signal from alarm(2)        SIGBUS       P2001      Core    Bus error (bad memory access)        SIGCHLD      P1990      Ign     Child stopped or terminated        SIGCLD         -        Ign     A synonym for SIGCHLD        SIGCONT      P1990      Cont    Continue if stopped        SIGEMT         -        Term    Emulator trap        SIGFPE       P1990      Core    Floating-point exception        SIGHUP       P1990      Term    Hangup detected on controlling terminal or death of controlling process        SIGILL       P1990      Core    Illegal Instruction        SIGINFO        -                A synonym for SIGPWR        SIGINT       P1990      Term    Interrupt from keyboard        SIGIO          -        Term    I/O now possible (4.2BSD)        SIGIOT         -        Core    IOT trap. A synonym for SIGABRT        SIGKILL      P1990      Term    Kill signal        SIGLOST        -        Term    File lock lost (unused)        SIGPIPE      P1990      Term    Broken pipe: write to pipe with no readers; see pipe(7)        SIGPOLL      P2001      Term    Pollable event (Sys V). Synonym for SIGIO        SIGPROF      P2001      Term    Profiling timer expired        SIGPWR         -        Term    Power failure (System V)        SIGQUIT      P1990      Core    Quit from keyboard        SIGSEGV      P1990      Core    Invalid memory reference        SIGSTKFLT      -        Term    Stack fault on coprocessor (unused)        SIGSTOP      P1990      Stop    Stop process        SIGTSTP      P1990      Stop    Stop typed at terminal        SIGSYS       P2001      Core    Bad system call (SVr4); see also seccomp(2)        SIGTERM      P1990      Term    Termination signal        SIGTRAP      P2001      Core    Trace/breakpoint trap        SIGTTIN      P1990      Stop    Terminal input for background process        SIGTTOU      P1990      Stop    Terminal output for background process        SIGUNUSED      -        Core    Synonymous with SIGSYS        SIGURG       P2001      Ign     Urgent condition on socket (4.2BSD)        SIGUSR1      P1990      Term    User-defined signal 1        SIGUSR2      P1990      Term    User-defined signal 2        SIGVTALRM    P2001      Term    Virtual alarm clock (4.2BSD)        SIGXCPU      P2001      Core    CPU time limit exceeded (4.2BSD); see setrlimit(2)        SIGXFSZ      P2001      Core    File size limit exceeded (4.2BSD); see setrlimit(2)        SIGWINCH       -        Ign     Window resize signal (4.3BSD, Sun) 通过pthread_kill进行线程间信号传递 信号可以时线程级别的可以通过 pthread_kill 给同进程的其他线程发信号可以通过 tgkill 给其他进程的指定线程发信号通过 raise 可以给当前线程发信号。 Demo: #include signal.h #include stdio.h #include stdlib.h #include unistd.h #include pthread.h #include sys/types.hpthread_t newtid;void usrHandler(int signum,siginfo_t *info,void *ucontext) {printf([SIGUSR1 handler thread] tid - %d , ready to send SIGUSR2 to child thread \n,gettid());pthread_kill(newtid,SIGUSR2);printf([SIGUSR1 handler thread] tid - %d , SIGUSR2 sent out \n,gettid()); }void usrHandler2(int signum,siginfo_t *info,void *ucontext) {printf([SIGUSR2 handler thread] tid - %d , %d , SIGUSR2 received \n,gettid(),signum); }void* threadRoutine(void* arg) {pthread_t tid *(pthread_t*)arg;printf([new thread] tid - %d , arg - %d \n,gettid(),tid);// set SIGSUR2sigset_t mask2;sigemptyset(mask2);struct sigaction act2;memset(act2,0x0,sizeof(struct sigaction));struct sigaction oldact2;memset(oldact2,0x0,sizeof(struct sigaction));act2.sa_sigaction usrHandler2;act2.sa_mask mask2;act2.sa_flags 0; //no flag is setsigaction(SIGUSR2, act2, oldact2);while(1) {;} }int main(int argc,char** argv) {printf([main thread] tid - %d \n,gettid()); // set SIGUSR1sigset_t mask;sigemptyset(mask);struct sigaction act;memset(act,0x0,sizeof(struct sigaction));struct sigaction oldact;memset(oldact,0x0,sizeof(struct sigaction));act.sa_sigaction usrHandler;act.sa_mask mask;act.sa_flags 0; //no flag is setsigaction(SIGUSR1, act, oldact);pthread_t maintid gettid();pthread_create(newtid,NULL,threadRoutine,(void*)maintid);sleep(2);while(1) {raise(SIGUSR1);sleep(2);} }上面的例子中主线程会循环给自己发信号 SIGUSR1 在信号处理函数中会给子线程发送 SIGUSR2。 当子线程通过pthread_kill给主线程发送信号时会产生 SIGSEGV 具体原因不明如果有类似情况可以参考如下 pthread_kill引发的争论 - 简书最近提测的一段代码中有一个遇到一个诡异的bug总是崩溃在pthread_kill这个函数上并且不是每次比现。调用逻辑大致如下利用pthread_kill判断一个线程是...https://www.jianshu.com/p/756240e837dd ps可以通过 pause 挂起当前线程直到等到一个信号为止可以通过 sigsuspend 挂起当前线程直到等到某些信号为止。 管理mask 每个线程都有自己的mask可以通过pthread_sigmask来管理。 通过mask进行信号block 使用sigaction创建信号处理策略时指定mask。被列入mask集合中的signal会被阻塞直到阻塞信号的动作结束这些信号会被继续投递到信号处理逻辑中。 比如通过sigaction 指定 “当发生SIGUSR1的时候阻塞所有SIGUSR2”那么如果 SIGUSR1 的信号处理函数耗时较长那么 SIGUSR2 会一直等到 SIGUSR1 的处理函数走完才会被递送给相应的进程/线程 以触发 默认动作/忽略动作/信号处理函数。 Demo #include signal.h #include stdio.h #include stdlib.h #include unistd.h#define USRSIG SIGUSR1 #define RTSIG SIGRTMIN8void usrHandler(int signum,siginfo_t *info,void *ucontext) {printf(%d , SIGUSR1 reveived \n,signum);printf(Sender pid[%d] , User cost time [%ld] , System cost time [%ld] , si_code [%d] \n ,info-si_pid,info-si_utime,info-si_stime,info-si_code);sleep(15);printf(exit usrHandler\n); }void usrHandler2(int signum,siginfo_t *info,void *ucontext) {printf(%d , SIGUSR2 received \n,signum); }int main(int argc,char** argv) { // set SIGUSR1sigset_t mask;sigemptyset(mask);sigaddset(mask,SIGUSR2); // SIGUSR2 will be blocked when usrHandler is executing. After return from usrHandler, SIGUSR2 will// be received adn surHandler2 will be executed.struct sigaction act;memset(act,0x0,sizeof(struct sigaction));struct sigaction oldact;memset(oldact,0x0,sizeof(struct sigaction));act.sa_sigaction usrHandler;act.sa_mask mask;act.sa_flags 0; //no flag is setsigaction(SIGUSR1, act, oldact);// set SIGSUR2sigset_t mask2;sigemptyset(mask2);struct sigaction act2;memset(act2,0x0,sizeof(struct sigaction));struct sigaction oldact2;memset(oldact2,0x0,sizeof(struct sigaction));act2.sa_sigaction usrHandler2;act2.sa_mask mask2;act2.sa_flags 0; //no flag is setsigaction(SIGUSR2, act2, oldact2);while(1) {;} }当通过 kill 连续发送 SIGUSR1 和 SIGUSR2 给上面的例子时会发现执行流程会卡在 SIGUSR1 处理函数的 sleep 这是因为针对 SIGUSR1 设置了block SIGUSR2这会导致 SIGUSR2 无法中断 SIGUSR1。
http://www.hkea.cn/news/14368845/

相关文章:

  • 购物网站开发小结自己做小程序要钱吗
  • 优秀电子商务网站如何让百度不收录网站
  • 网红营销的劣势安全优化大师下载
  • 优惠券网站怎样做广东城市建设档案馆官方网站
  • 长沙微网站手机制作网站的软件有哪些内容
  • 那些公司需要网站开发工程师西宁高端网站建设
  • 郑州恩恩网站建设建个什么网站赚钱
  • 培训课程网站建设做电影网站服务器
  • 建设银行网站用户名怎么查建设银行贷款官方网站
  • 中铁建设集团官方网站搭建一个网站大概需要多少钱
  • 找加工厂上什么网站wordpress登录微信插件下载
  • 网站开发文档包括网站建设提问
  • 网站运营总监app程序制作
  • 河南企业网站制作wordpress做视频网站吗
  • 免费建站手机软件石家庄网页定制开发
  • 行业网站方案WordPress静态文件存储
  • 官方网站aspcms新手seo网站做什么类型好
  • 企业网站设计建设服务器购物网页设计代码
  • 云服务器做网站好吗网站页面设计风格
  • 域名备案需要多少时间官网seo关键词排名系统
  • 南京外贸网站建设系统天美影视传媒有限公司
  • 网站服务商是什么许昌专业做网站公司
  • 一级a做爰片免费网站下载服装类电子商务网站建设报告
  • 做软件网站网页制作的收获与体会
  • 网站优怎么做沈阳门户网
  • 五道口网站建设做内部优惠券网站赚钱吗
  • 网站换模板要怎么做网站备案名 企业名
  • 中国域名门户网站wordpress同步到公众平台
  • 学而思编程网站对电子政务做技术支持的网站
  • 购物网站开发 书籍婚纱摄影哪家好