Linux signal 那些事儿(4)信号的deliver顺序

【信息科学与工程学】计算机科学与技术——第七十七篇 系统架构设计02 编号类型模型配方企业资本运作的方法/规则/条件/依据及所有的步骤(​风险处理/异常处理/危机应对关联知识法律法规和裁决依据​​由发起人(通常是知名投资人、投行或产业资本)先设立一个只有现金、无实际业务的特殊目的收购公司(SPAC),通过IPO募集资金并在交易所上市。然后在规定时间内(通常24个月)寻找一家非上市公司进行合并(De-SPAC),使目标公司迅速实现上市,规避传统IPO的复杂流程和不确定性。1.:在开曼或特拉华注册空壳公司,注入少量种子资金。2. 阅读详情

分类: LINUX

    上一篇博文提到了,如果同时有多个不同的信号处于挂起状态,kernel如何选择deliver那个信号。
    
    next_signal 负责从挂起信号中选择deliver的signo:当然,有线程显存私有的penging,有线程组共有的pending,对于线程而言,先从自己私有的pending中选,处理完毕私有的才会去处理线程组共有的pending,这个逻辑的代码在:
  1. int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
  2. {
  3.     int signr;

  4.     /* We only dequeue private signals from ourselves, we don't let
  5.      * signalfd steal them
  6.      */
  7.     signr = __dequeue_signal(&tsk->pending, mask, info);  //线程私有的penging优先
  8.     if (!signr) {
  9.         signr = __dequeue_signal(&tsk->signal->shared_pending,
  10.                      mask, info);
  11.        。。。。
  12. }
    换句话说,如果存在挂起队列中,我们用tkill/tgkill发送的信号会先于用kill发送的信号被deliver,这个我们按下不提,我们看在同一个penging队列中如何挑选下个deliver的signal:
  1. int next_signal(struct sigpending *pending, sigset_t *mask)
  2. {
  3.     unsigned long i, *s, *m, x;
  4.     int sig = 0;

  5.     s = pending->signal.sig;
  6.     m = mask->sig;

  7.     /*
  8.      * Handle the first word specially: it contains the
  9.      * synchronous signals that need to be dequeued first.
  10.      */
  11.     x = *s &~ *m;
  12.     if (x) {
  13.         if (x & SYNCHRONOUS_MASK)
  14.             x &= SYNCHRONOUS_MASK;
  15.         sig = ffz(~x) + 1;
  16.         return sig;
  17.     }

  18.     switch (_NSIG_WORDS) {
  19.     default:
  20.         for (i = 1; i < _NSIG_WORDS; ++i) {
  21.             x = *++s &~ *++m;
  22.             if (!x)
  23.                 continue;
  24.             sig = ffz(~x) + i*_NSIG_BPW + 1;
  25.             break;
  26.         }
  27.         break;

  28.     case 2:
  29.         x = s[1] &~ m[1];
  30.         if (!x)
  31.             break;
  32.         sig = ffz(~x) + _NSIG_BPW + 1;
  33.         break;

  34.     case 1:
  35.         /* Nothing to do */
  36.         break;
  37.     }

  38.     return sig;
  39. }

  1. #define SYNCHRONOUS_MASK \
  2.     (sigmask(SIGSEGV) | sigmask(SIGBUS) | sigmask(SIGILL) | \
  3.      sigmask(SIGTRAP) | sigmask(SIGFPE) | sigmask(SIGSYS))

    上一篇博客讲了处于 SYNCHRONOUS_MASK 里面的信号是优先处理的信号,他们都是一些硬件相关 的信号,多是由于异常出错引起。其次是传统信号,[32,64 ]之间的实时信号,优先级最低。
    换句话说所有信号分成三个等级,{SIGILL( 4),SIGTRAP( 5),SIGBUS(7),SIGFPE(8),SIGSEGV(11),SIGSYS(31) },这是第一等级,传统信号中排除第一等级的信号,就是第二等级的信号,[34,64 ]之间的信号属于第三等级。如果同一等级内,存在多个信号,按照小信号优先的顺序去deliver。
    举个例子:   
  1. kill -10 $signal_pid
  2. kill -3 $signal_pid
  3. kill -12 $signal_pid
  4. kill -11 $signal_pid
  5. kill -39 $signal_pid
  6. kill -2 $signal_pid
  7. kill -5 $signal_pid
  8. kill -4 $signal_pid
  9. kill -36 $signal_pid
  10. kill -24 $signal_pid
  11. kill -38 $signal_pid
  12. kill -37 $signal_pid
  13. kill -31 $signal_pid
  14. kill -8 $signal_pid
  15. kill -7 $signal_pid
    我们可以看到,我们向同一进程发送多个信号,加入进程阻塞了所有信号(当然SIGKILL/SIGSTOP 不考虑 )。这时候,这些个信号,都会位于挂起信号之中,一旦进程解除阻塞,那么考验deliver顺序的时候到了。
    我们按照kernel的规则,顺序应该是{4,5,7,8,11,31,           2,3,10,12,24,              36,37,38 }这么个顺序。
    写个测试程序:   
  1. root@manu-hacks:~/Dropbox/Note/signal# cat signal_delivery_order.c 
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <signal.h>
  6. #include <string.h>
  7. #include <errno.h>


  8. static int sig_cnt[NSIG];
  9. static number= 0 ;
  10. int sigorder[128]= {0};

  11. #define MSG "#%d:receiver signal %d\n"

  12. void handler(int signo)
  13. {
  14.     sigorder[number++] = signo;
  15. }

  16. int main(int argc,char* argv[])
  17. {
  18.     int i = 0; 
  19.     int k = 0;
  20.     sigset_t blockall_mask ;
  21.     sigset_t pending_mask ; 
  22.     sigset_t empty_mask ; 
  23.     struct sigaction sa ;
  24.     

  25.     sigfillset(&blockall_mask);
  26. #ifdef USE_SIGACTION
  27.     sa.sa_handler = handler;
  28.     sa.sa_mask = blockall_mask ; 
  29.     sa.sa_flags = SA_RESTART;
  30. #endif


  31.     printf("%s:PID is %ld\n",argv[0],getpid());

  32.     
  33.     for(i = 1; i < NSIG; i++)
  34.     {
  35.         if(i == SIGKILL || i == SIGSTOP)
  36.             continue;
  37. #ifdef USE_SIGACTION 
  38.         if(sigaction(i,&sa, NULL)!=0)
  39. #else 
  40.         if(signal(i,handler)== SIG_ERR)
  41. #endif 
  42.         {
  43.             fprintf(stderr,"sigaction for signo(%d) failed (%s)\n",i,strerror(errno));
  44. //            return -1;
  45.         }
  46.     }

  47.     if(argc > 1)
  48.     {
  49.         int sleep_time = atoi(argv[1]);

  50.         if(sigprocmask(SIG_SETMASK,&blockall_mask,NULL) == -1)
  51.         {
  52.             fprintf(stderr,"setprocmask to block all signal failed(%s)\n",strerror(errno));
  53.             return -2;
  54.         }

  55.         printf("I will sleep %d second\n",sleep_time);

  56.         sleep(sleep_time);
  57.         if(sigpending(&pending_mask) == -1)
  58.         {
  59.             fprintf(stderr,"sigpending failed(%s)\n",strerror(errno));
  60.             return -2;
  61.         }

  62.         for(i = 1 ; i < NSIG ; i++)
  63.         {
  64.             if(sigismember(&pending_mask,i))
  65.             printf("signo(%d) :%s\n",i,strsignal(i));
  66.         }

  67.         sigemptyset(&empty_mask);
  68.         if(sigprocmask(SIG_SETMASK,&empty_mask,NULL) == -1)
  69.         {
  70.             fprintf(stderr,"setprocmask to release all signal failed(%s)\n",strerror(errno));
  71.             return -3;
  72.         }

  73.         for( i = 0 ; i < 1000000 ; i++)
  74.         {
  75.             k = random()%1234567;
  76.             
  77.         }
  78.         
  79.     }

  80.     for(i = 0 ; i< number ; i++)
  81.     {
  82.      if(sigorder[i] != 0)
  83.         {
  84.             printf("#%d: signo=%d\n",i,sigorder[i]);
  85.         }
  86.     }

  87.     return 0;

  88. }
    注意这个USE_SIGACTION宏包裹的部分是我后来想到的,在我开始的版本中用的是signal(i,handler)来注册函数。handler函数很有意思,是我精心设计的:  
  1. void handler(int signo)
  2. {
  3.     sigorder[number++] = signo;
  4. }
   按照执行的顺序,我会讲signo的值记录在全局数组中,等到进程退出前,我打印数组的值,就能得到信号deliver的顺序。
    这个进程会阻塞 所有信号一段时间,在这段时间内,我会向该进程发送一坨信号,待阻塞解除后,打印数组的值,从而获得deliver的顺序。
    看下测试程序:   
  1. root@manu-hacks:~/code/c/self/signal_deliver# cat test_order.sh 
    #!/bin/bash 


    if [ $1 -eq 0 ]
    then
    ./sigaction_delivery_order  30  &    #正确的程序
    else
    ./signal_delivery_order  30 &        #我最初的程序,信号处理函数执行期间,没有屏蔽其他信号。
    fi
    signal_pid=$!


    sleep 2
    kill -10  $signal_pid
    kill -3  $signal_pid
    kill -12  $signal_pid
    kill -11  $signal_pid
    kill -39  $signal_pid
    kill -2   $signal_pid
    kill -5   $signal_pid
    kill -4   $signal_pid
    kill -36  $signal_pid
    kill -24  $signal_pid
    kill -38  $signal_pid
    kill -37  $signal_pid
    kill -31  $signal_pid
    kill -8   $signal_pid
    kill -7   $signal_pid


    设计很精巧,设计出这个程序后,我很得意,认为验证deliver传递顺序是水到渠成的事情。
    梦想很丰满,无奈现实很骨感,我看了执行结果,那是当头一棒啊:
  1. root@manu-hacks:~/Dropbox/Note/signal# 
  2. root@manu-hacks:~/Dropbox/Note/signal# ./test_order.sh 1 
  3. ./signal_delivery_order:PID is 31403
  4. sigaction for signo(32) failed (Invalid argument)
  5. sigaction for signo(33) failed (Invalid argument)
  6. I will sleep 30 second
  7. root@manu-hacks:~/Dropbox/Note/signal# signo(2) :Interrupt
  8. signo(3) :Quit
  9. signo(4) :Illegal instruction
  10. signo(5) :Trace/breakpoint trap
  11. signo(7) :Bus error
  12. signo(8) :Floating point exception
  13. signo(10) :User defined signal 1
  14. signo(11) :Segmentation fault
  15. signo(12) :User defined signal 2
  16. signo(24) :CPU time limit exceeded
  17. signo(31) :Bad system call
  18. signo(36) :Real-time signal 2
  19. signo(37) :Real-time signal 3
  20. signo(38) :Real-time signal 4
  21. signo(39) :Real-time signal 5
  22. #0: signo=39
  23. #1: signo=38
  24. #2: signo=37
  25. #3: signo=36
  26. #4: signo=24
  27. #5: signo=12
  28. #6: signo=10
  29. #7: signo=3
  30. #8: signo=2
  31. #9: signo=31
  32. #10: signo=11
  33. #11: signo=8
  34. #12: signo=7
  35. #13: signo=5
  36. #14: signo=4
    顺序恰恰相反!!!!
   
 我最初完全解释不通,我google了类似的topic,我发现,我不是第一个发现这个问题的人,绚丽也尘埃在一篇博客中提到: 
  1. 在网上找到这样一段话:
  2. 信号的优先级:信号实质上是软中断,中断有优先级,信号也有优先级。如果一个进程有多个未决信号,则对于同一个未决的实时信号,内核将按照发送的顺序来递送信号。如果存 在多个未决的实时信号,则值(或者说编号)越小的越先被递送。如果既存在不可靠信号,又存在可靠信号(实时信号),虽然POSIX对这一情况没有明确规 定,但Linux系统和大多数遵循POSIX标准的操作系统一样,将优先递送不可靠信号。

  3. 经过我反反复复地试验,我发现实验结果和上面描述的刚好相反,信号的编号越大越先被递送,一个进程如果处理SIGQUIT(3),SIGINT(2),SIGHUP(1)(通过”kill -l”可以查看信号的编号),那么先后给该进程发送SIGINT,SIGHUP,SIGQUIT,处理的顺序会是SIGQUIT,SIGINT,SIGHUP,不论改变这个三个信号的发送顺序,处理的顺序都是一样的。
    看到了,这位前辈遇到了和我一样的困惑,测试的结果和kernel完全相反。内核不会错,glibc也肯定不会瞎掺合,一定是我的测试程序存在问题:
    今天我坐公交车上,突然意识到问题的所在,我的信号处理函数没有屏蔽信号!!!
    换句话说,4号信号是先被deliver的,但是还没能handler执行,被5号信号中断掉了,5号信号还没开始执行,被7号信号中断掉了,依次类推,所以我们测试的结果和deliver的结果正好相反。
    意识到这一点,我就改进了我的程序,信号执行期间,屏蔽所有信号,这样,就能测试信号deliver的顺序了。对于我的程序而言就是加上-DUSE_SIGACTION选项,让sigaction安装信号时,指明信号处理函数执行期间,屏蔽所有信号。
     在我的64位Ubuntu上执行,结果和kernel代码以及手册上的一样。也就是说,并不是手册描述错了,而是我们的老的测试程序,在signal处理期间,没有屏蔽其他信号导致混乱。那么按照正确的方法测试:
  1. root@manu-hacks:~/code/c/self/signal_deliver# ./test_order.sh 0 
  2. ./sigaction_delivery_order:PID is 3652
  3. sigaction for signo(32) failed (Invalid argument)
  4. sigaction for signo(33) failed (Invalid argument)
  5. I will sleep 30 second
  6. root@manu-hacks:~/code/c/self/signal_deliver# signo(2) :Interrupt
  7. signo(3) :Quit
  8. signo(4) :Illegal instruction
  9. signo(5) :Trace/breakpoint trap
  10. signo(7) :Bus error
  11. signo(8) :Floating point exception
  12. signo(10) :User defined signal 1
  13. signo(11) :Segmentation fault
  14. signo(12) :User defined signal 2
  15. signo(24) :CPU time limit exceeded
  16. signo(31) :Bad system call
  17. signo(36) :Real-time signal 2
  18. signo(37) :Real-time signal 3
  19. signo(38) :Real-time signal 4
  20. signo(39) :Real-time signal 5
  21. #0: signo=4
  22. #1: signo=5
  23. #2: signo=7
  24. #3: signo=8
  25. #4: signo=11
  26. #5: signo=31
  27. #6: signo=2
  28. #7: signo=3
  29. #8: signo=10
  30. #9: signo=12
  31. #10: signo=24
  32. #11: signo=36
  33. #12: signo=37
  34. #13: signo=38
  35. #14: signo=39
     和我们预想的完全符合,和内核代码已经手册完全一样。那么这个问题完美解决。
  1. {4,5,7,8,11,31, 2,3,10,12,24, 36,37,38}
     多个挂起信号时,delivery的策略如下:     
    1   {SIGILL( 4),SIGTRAP( 5),SIGBUS(7),SIGFPE(8),SIGSEGV(11),SIGSYS(31) }第一等级
    2  非实时信号中其他信号是第二等级(SIGKILL SIGSTOP除外)
    3  实时信号是第三等级。
    存在第一等级的信号挂起,那么优先选择第一等级,
     没有第一等级,那么如果存在第二等级的信号,优先选择第二等级内信号。 
    既没有第一等级,又没有第二等级,那么选择第三等级的信号。
    如果同一个等级内都存在多个挂起信号,则小信号优先。

    这只是我们用程序测试的结果,其实systemtap提供了signal_deliver这个event让我们monitor,我们可以直观的看到信号传递的顺序:   
  1. root@manu-hacks:~/code/c/self/signal_deliver# cat signal_deliver.stp 
  2. probe kernel.trace("signal_deliver"){
  3.     if(pid() == target())
  4.     {
  5.      printf("signo(%2d) is delivered to PID %8d\n",$sig,pid());
  6.     }
  7. }
     我们可以用test_order.sh 1 ,故意用signal那个给我带来困扰的程序测试,我们会看到,传递的顺序依然是对的,这证明了我前面的推测,4是最先deliver的,只不过是因为没有屏蔽其他信号,被5号信号中断了,5又被7号信号中断了,依次类推,导致了我们看到了相反的执行顺序,给我们带来了困扰。  
  1. root@manu-hacks:~/code/c/self/signal_deliver# ./test_order.sh 1
    ./signal_delivery_order:PID is 4051
    sigaction for signo(32) failed (Invalid argument)
    sigaction for signo(33) failed (Invalid argument)
    I will sleep 30 second
    root@manu-hacks:~/code/c/self/signal_deliver# stap -x 4051 signal_deliver.stp 
    signo(2) :Interrupt
    signo(3) :Quit
    signo(4) :Illegal instruction
    signo(5) :Trace/breakpoint trap
    signo(7) :Bus error
    signo(8) :Floating point exception
    signo(10) :User defined signal 1
    signo(11) :Segmentation fault
    signo(12) :User defined signal 2
    signo(24) :CPU time limit exceeded
    signo(31) :Bad system call
    signo(36) :Real-time signal 2
    signo(37) :Real-time signal 3
    signo(38) :Real-time signal 4
    signo(39) :Real-time signal 5
    #0: signo=39
    #1: signo=38
    #2: signo=37
    #3: signo=36
    #4: signo=24
    #5: signo=12
    #6: signo=10
    #7: signo=3
    #8: signo=2
    #9: signo=31
    #10: signo=11
    #11: signo=8
    #12: signo=7
    #13: signo=5
    #14: signo=4
    signo( 4)  is delivered to PID     4051
    signo( 5)  is delivered to PID     4051
    signo( 7)  is delivered to PID     4051
    signo( 8)  is delivered to PID     4051
    signo(11)  is delivered to PID     4051
    signo(31)  is delivered to PID     4051
    signo( 2)  is delivered to PID     4051
    signo( 3)  is delivered to PID     4051
    signo(10)  is delivered to PID     4051
    signo(12)  is delivered to PID     4051
    signo(24)  is delivered to PID     4051
    signo(36)  is delivered to PID     4051
    signo(37)  is delivered to PID     4051
    signo(38)  is delivered to PID     4051
    signo(39)  is delivered to PID     4051


    ^Croot@manu-hacks:~/code/c/self/signal_deliver# 


     话说systemtap提供了很多signal相关的example脚本,非常好用,如下图,收集signal的发送情况:
    

参考文献
1  Linux实时信号排队
2  LKML:
    Subject [PATCH -tip v4 2/3] tracepoint: Add signal deliver even
QMT实盘交易入门:5分钟搞定ETF全球配置策略(附完整代码) 本文详细介绍了如何使用QMT平台实现ETF全球配置策略,从环境准备到策略编写、实盘部署全流程仅需5分钟。通过xtquant库对接交易所接口,提供完整的动量轮动策略代码,帮助投资者快速掌握自动交易技术,优化全球资产配置。 阅读详情

相关推荐

3DSlicer冠脉分割实战:从DICOM导入到三维重建的完整流程(附常见问题解决)

本文详细介绍了使用3DSlicer进行冠脉分割的完整流程,从DICOM数据导入到三维重建,涵盖环境配置、视图优化、心脏区域分割及冠脉精细分割等关键步骤。针对常见问题提供实用解决方案,帮助医学影像从业者高效完成心血管结构分析,提升诊断准确性。

weixin_29271053的博客 628

signal信号的基础知识

1

modi000的博客 3285

【AI】使用Cursor和AI编程生成的VUE前端框架

本项目是一个基于VUE.js的前端框架,结合了登录、图形验证码、权限校验等常用功能模块。通过与Cursor AI交互生成的代码,展示了AI在编程中的潜力与效率。

清欢渡的博客 9862

NDK 函数定义了返回值,却没有返回,引发 signal 4 (SIGILL) 错误

      在做NDK开发的时候,引用了在嵌入式(非android平台)上的代码过来,明明原先正常使用的代码,移植过来就发生挂死, 由于代码太多,而LLDB又不能够跟踪到具体某一行的,只能一步一步地单步调试,最后发现了竞是 函数中定义了返回值,却没有返回 惹的祸。 错误信息 出错代码 打开编译警告       鉴于此,为了检查还有多少代码有这种问题,得修改CMakefile,让所...

alist的笔记专栏 4063

[WeChatMsg]导出csv格式微信聊天记录的手把手教程

手把手教大家如何导出自己的聊天记录得到csv文件,即使是电脑小白也可以轻松学会o(* ̄▽ ̄*)ブ

weixin_51094633的博客 1万+

EB配置输入捕获ICU模块----基于S32K3

基于S32K311芯片,EB配置ICU输入捕获(Emios 和Siul)

weixin_43586400的博客 1772

Linux的Signal及Singal处理(SIGQUIT SIGKILL SIGBUS等)

Linux的Signal及Singal处理(SIGQUIT SIGKILL SIGBUS等) 关于 在Linux应用程序调试中,应用程序异常退出,或收到若干信号后程序退出,该如何排错呢?本文尝试提供一点思路.【Linux应用程序调试系列说明】,专注于Linux应用程序的如何调试及部分调试技巧。为写商业应用程序时出现调试问题,提供一点思路。 工具箱 1 kill命令 k

liuzheng081的博客 4284

Cursor AI编程工具保姆级安装指南:从下载到中文界面设置(含免费额度说明)

本文提供Cursor AI编程工具的保姆级安装与设置教程。详细指导从官网下载、安装到中文界面切换的每一步,并重点说明其每月500次高级模型调用的免费额度策略。通过个性化设置与核心插件推荐,帮助开发者快速上手,提升AI辅助编程效率。

weixin_29191761的博客 672

[原]NDK程序在虚拟机上运行出现signal 4 (SIGILL), fault addr 错误的原因及解决方法

终于到了移植的最后一步 ,但是编译出来的SO文件加入工程后在虚拟机上总是无法执行,查看DDMS发现报错03-14 10:43:08.623: INFO/DEBUG(28): signal 4 (SIGILL), fault addr 80a43224 03-14 10:43:08.643: INFO/DEBUG(28): r0 00000000 r1 00000000 r2 afe42c7c r3 00000000 .... 百思不得其解,想为啥会这样呢,因为这个测试代码用NDK直接编译成功运行

RR的专栏 1万+

IEC103协议实战指南:报文解析与传输优化策略

本文深入解析IEC103协议在电力自动化系统中的核心应用,重点拆解其固定帧与可变帧两种报文格式,并详细阐述了主从问答与非平衡传输机制。文章结合实战经验,针对报文解析中的常见问题(如字节序、超时重发)提供了解决方案,并探讨了传输层优化策略,旨在帮助工程师实现更可靠、高效的通信链路。

r2s3t4的博客 541

Newton & Nvidia 开源 GPU 加速机器人仿真器入门教程(一)

Newton 是一个 GPU 加速、可扩展和可微分的物理仿真引擎,专为机器人、研究和高级仿真工作流而设计。Newton 基于 NVIDIA Warp 并集成了 MuJoCo Warp,为用户和开发人员提供了高性能仿真、现代 Python API 和灵活的架构。

机器人控制与仿真应用 1482

Linux 常用命令

原文链接:https://www.cnblogs.com/ylq1990/p/6494565.html 1、ls  2、cd  3、pwd  4、mkdir  5、rm  6、rmdir  7、mv  8、cp  9、cat  10、more   11、less  12、head  13、tail  14、which  15、whereis  16、locate  17、find  18、chm

AC_Dreameng 1472

智驾车载以太网(18)-switch之报文转发和vlan处理流程

本文详细解析了交换机中报文处理和转发流程:1)通过目标MAC查找转发端口,源MAC创建ARL条目;2)VLAN标签处理包括tagged/untagged帧判断、默认VID标记等5种处理方式;3)完整转发流程包含CRC校验、IQ封装、VLAN和ARL表查询、端口向量计算及优先级队列发送。文中还涉及TCAM修改VLAN、802.1q多种模式处理等细节,省略了流量控制等次要流程。该过程实现了基于MAC和VLAN的高效二层交换。

mitugaoyang1993的博客 43

deliver用法linux,Linux signal 那些事儿(4)信号的deliver顺序

root@manu-hacks:~/code/c/self/signal_deliver# ./test_order.sh 1./signal_delivery_order:PID is 4051sigaction for signo(32) failed (Invalid argument)sigaction for signo(33) failed (Invalid argument)I wi...

weixin_36051940的博客 318

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

linux 的deliver用法,Linux signal 那些事儿(4)信号的deliver顺序

root@manu-hacks:~/code/c/self/signal_deliver# ./test_order.sh 1./signal_delivery_order:PID is 4051sigaction for signo(32) failed (Invalid argument)sigaction for signo(33) failed (Invalid argument)I wi...

weixin_39653481的博客 283

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

deliver用法linux,【IT专家】Linux signal 那些事儿(4)信号的deliver顺序

本文由我司收集整编,推荐下载,如有疑问,请与我司联系Linux signal 那些事儿(4)信号的deliver顺序2014/10/24 0 Linux signal 那些事儿(4)信号的deliver顺序2014-01-18 14:12:18分类:LINUX上一篇博文提到了,如果同时有多个不同的信号处于挂起状态,kernel如何选择deliver那个信号。next_signal 负责从挂起信号...

weixin_29613859的博客 313

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

终端工作原理拆解:TTY、pty、Shell与ANSI转义序列详解

终端是开发者日常使用最频繁的交互工具,但其背后从键盘按键到屏幕渲染的完整链路却常常被忽略。理解终端工作原理,本质上需要掌握TTY、伪终端(pty)、Shell、终端模拟器以及ANSI转义序列等核心概念。键盘输入经由内核驱动、行规程处理,再通过pty设备传递给Shell或进程;进程输出则通过标准流反向传输,由终端模拟器解析控制序列并呈现。这一机制不仅支撑着命令行操作、SSH远程管理、串口调试和容器交互等场景,也是排查终端乱码、界面错乱、进程挂起等高频问题的关键。结合VSCode终端编码设置、Linux终端换行

weixin_34087307的博客 541

Linux signal 那些事儿(4)信号的deliver顺序【转】

转自:http://blog.chinaunix.net/uid-24774106-id-4084864.html 上一篇博文提到了,如果同时有多个不同的信号处于挂起状态,kernel如何选择deliver那个信号。          next_signal 负责从挂起信号中选择deliver的signo:当然,有线程显存私有的penging,有线程组共有的pending,对于线程而言,...

weixin_33963594的博客 138

H3C WA4320ACN胖瘦AP命令行WiFi设置与排障指南

无线局域网中,AP负责将终端接入网络,其配置方式直接影响覆盖、漫游与安全。企业级AP通常支持胖AP与瘦AP两种架构:胖AP本地完成认证、转发与射频管理,瘦AP则通过AC集中下发服务模板与策略。命令行配置之所以重要,是因为设备常部署在弱电井、吊顶等不便图形化接入的位置,只能依赖Console或SSH。围绕H3C WA4320ACN,掌握WA4320ACN模式切换、无线服务模板、射频绑定、WPA2-PSK加密及常见故障排查,可提升企业WiFi部署效率与可维护性。

weixin_34197488的博客 340

signal4

Linux signal           next_signal 负责从挂起信号中选择deliver的signo:当然,有线程显存私有的penging,有线程组共有的pending,对于线程而言,先从自己私有的pending中选,处理完毕私有的才会去处理线程组共有的pending,这个逻辑的代码在: int dequeue_signal(struc

fengpsky 1059

模块化AI代理:面向股票投资的MCP协议架构与实战

模块化AI代理是一种将复杂AI系统拆解为职责单一、接口标准、可独立演进的功能单元的技术范式,其核心在于通过数据契约、状态机和通信协议实现确定性协作。相比端到端大模型或通用AI框架(如LangChain),它更强调金融场景所需的精度控制、审计可追溯性与数据源韧性。在量化投研中,模块化设计能有效应对API失效、逻辑适配滞后和监管溯源等高频痛点,支撑实盘级AI决策系统的构建与迭代。本文以股票投资为典型场景,详解基于MCP协议的模块化AI代理落地路径。

316

基于AgentCouch框架构建多智能体协作系统的实战指南

多智能体系统(Multi-Agent System)是人工智能领域的重要分支,旨在通过多个自主智能体的协同工作来解决复杂问题。其核心原理在于设计标准化的通信协议与协调机制,使各智能体能够共享信息、协商决策并共同执行任务。这种架构的技术价值在于突破了单一模型的局限性,通过分工协作实现更强大的问题解决能力和更高的系统鲁棒性。在应用场景上,多智能体系统广泛应用于自动化工作流编排、复杂任务分解、分布式决策支持等领域。本文聚焦于**AgentCouch**这一创新开源框架,它通过引入类似**MCP(Model Con

weixin_30681121的博客 420

常用的几个kill,以及进程的状态

kill -1 终端断线 == kill -HUP +pid kill -2 中断(等同 Ctrl + C) == kill -INT +pid kill -3 退出(同 Ctrl + \) kill -9 强制终止 kill -15 终止(可以使得进程在退出之前清理并释放资源) kill -18 继续(与19相反)== kill -CONT +pid kill -19 暂停(等同 Ctrl + Z)== kill -STOP +pid STAT-显示了进.

weixin_45029724的博客 4917
上一篇: Linux signal 那些事儿 (3)
下一篇: 有关Linux线程的问题,有几个需要澄清的:
raidtest
博客等级 码龄25年 164粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值