在Linux服务端后台开发中,经常会用到信号处理函数:sigprocmask和sigsuspend。这篇文章主要通过一个综合实例演示如何使用sigprocmask函数屏蔽目标信号(信号掩码)以及sigsuspend函数挂起进程。
在Linux中,要发送一个信号相当容易。程序员需要知道两个信息:要发送哪个信号,将这个信号发送给哪个进程。可以用 man 7 signal 找到一个可以利用的信号的列表。用户可以只将信号发送给用户自己的进程,也可以以root身份运行从而将信号发送给任意一进程。
好久没更新博客了,写篇文章除除草。这篇文章主要通过简单的例子说明一下Unix/Linux进程中如果捕捉和处理SIGTERM、SIGUSR1和SIGUSR2信号。
首先是我这两天看了一些三国演义,我决定学习罗贯中大爷那种给章节起名的方式,你们先xue微感受一下,如果觉得不好恶心想吐,那么你们都给我忍着!!!
Notify函数让signal包将输入信号转发到c。如果没有列出要传递的信号,会将所有输入信号传递到c;否则只传递列出的输入信号。
共享内存是Linux系统进程间通信常用的方式,通常用于数据量较大的情况,如果只是用于不同的进程间消息通知,那不如用消息队列或者socket。之前做的项目中,使用共享内存的其实只有一种情况:视频数据的共享。设备类似于DVR,视频采集编码在一个独立的程序中,另一个程序负责协议通信。
大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【驱动层中,如何发送信号给应用程序】。
什么是信号 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。 收到信号的进程对各种信号有不同的
SIGABORT—— 进程异常终止 SIGALRM ——超时告警 SIGFPE —— 浮点运算异常 SIGHUP ——连接挂断 SIGILL——非法指令 SIGINT ——终端中断 (Ctrl+C将产生该信号) SIGKILL ——*终止进程 SIGPIPE ——向没有读进程的管道写数据 SIGQUIT——终端退出(Ctrl+\将产生该信号) SIGSEGV ——无效内存段访问 SIGTERM ——终止 SIGUSR1——*用户自定义信号1 SIGUSR2 ——*用户自定义信号2 -------------------------------------->以上信号如果不被捕获,则进程接受到后都会终止! SIGCHLD——子进程已停止或退出 SIGCONT ——*让暂停的进程继续执行 SIGSTOP ——*停止执行(即“暂停") SIGTSTP——断挂起 SIGTTIN —— 后台进程尝试读操作 SIGTTOU——后台进程尝试写
默认情况下,MongoDB的日志始终会写到同一个文件中。在Linux系统下,这个日志文件为 /var/log/mongodb/mongodb.log。随着时间的推移,这个文件会越来越大:
过去,当一个信号被发送后,除了知道发生了一个信号之外,处理函数对于发生了什么一无所知。现在内核可以给处理函数提供大量的上下文,甚至信号能传递用户定义的数据,跟后来更高级的IPC通信机制一样。
最近在给mongodb加个log rotate的脚本,偶然发现下面这行命令在sh脚本里面执行报错
Linux进程间通信(Inter-Process communication, IPC)机制通常分6种:
父子进程的调度由操作系统来负责,具体先调度子进程还是父进程由系统的调度算法决定,当然可以在父进程加上延时或是调用进程回收函数 pcntl_wait 可以先让子进程先运行,进程回收的目的是释放进程创建时占用的内存空间,防止变成僵尸进程。
signal包的核心是使用signal.signal()函数来预设(register)信号处理函数,如下所示:
一、sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。 原型:int sigqueue(pid_t pid, int s
快一个月没发博文了,之前都在深入研究php多进程tcp服务器,结果到现在也没搞出一个完美的解决方案,所以还是先发下这个月学到的东西吧
性能测试工具有gperf、gperftools、oprofile、intel vtune amplifier 等。Gperf是GNU自带工具,可以通过编译的时候加-pg加载进去,缺点是不能测试动态库。Oprofile是免费工具,一般Linux系统自带,嵌入到内核中,缺点是不能再虚拟机上运行。Gperftools是Google出的工具,主要提供高性能内存管理,性能测试只是4个主要功能中的一个,缺点是需要再链接的加入gperftools的库。intel vtune amplifier是商用软件,站在一个正规软件公司的角度,在没有购买到授权前,暂不考虑使用。几个工具实现的原理可以参考https://www.cnblogs.com/likwo/archive/2012/12/20/2826988.html。
如果已经在LNMP架构下工作2-3年时间,这个阶段我们对自己常用的技术栈的工作原理一定需要有一个基本的认识。一方面,可以去学习这些优秀软件的设计思路,另一方面,可以为分析系统瓶颈和系统优化打好基础。今天我们就来看看php-fpm/nginx/redis/mysql的进程模型。
subprocess.Popen(['google-chrome',"http://www.baidu.com"])可打开chrome并显示百度网页。
MongoDB 默认是不会进行切割日志的,除非我们配置了 logRotate = rename,并且重启 MongoDB 服务,才会进行切割日志的,那么为了避免实际中我们一个日志文件过大,我们需要对日志进行切割,有两个办法:
在 Java 中打印当前线程的方法栈,可以用 kill -3 命令向 JVM 发送一个 OS 信号,JVM 捕捉以后会自动 dump 出来;当然,也可以直接使用 jstack 工具完成,这些方法好几年前我在这篇性能分析的文章中介绍过。这样的需求可以说很常见,比如定位死锁,定位一个不工作的线程到底卡在哪里,或者定位为什么 CPU 居高不下等等问题。
进程信号是在操作系统中用于进程间通信和控制的一种机制。当一个进程接收到一个信号时,操作系统会做出相应的处理,例如终止进程、暂停进程等。在 Linux 中,进程信号被广泛应用于多种场景,例如进程间通信、异常处理、线程同步等。本文将详细介绍 Linux 进程信号的基本概念、信号类型、信号处理方式、信号传递机制以及如何使用进程信号进行进程间通信、异常处理等。
~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
依据客户端查询来设计集合的片键及索引,最近几天突然需要查询历史数据进行分析,我们的有些集合count达到亿条以上,每个文档几百个字段。突如其来的查询分析,数据库非常的卡,尤其这几天刚刚加入一个新的分片。前天上午来看,发现主分片竟然奔溃了,至于为什么查询量大,数据库会奔溃,需要后续进行分析。
根据上面存储的static::不能识别此Latex公式: _workers和static::_pidMap 循环fork进程
不能识别此Latex公式: _workers和static::
要对一个信号进行处理(除了无法捕捉的SIGKILL和SIGSTOP),需要为其注册相应的处理函数,通过调用signal()函数可以进行注册。
列表中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。
mongodb默认不提供直接按天来输出日志文件的配置,但是提供一个日志清理的命令:logRotate。如果日志不及时清理会导致mongo访问越来越慢,甚至卡死。
Kernel里,每个Task都有针对Signal的掩码(Mask)。掩码值为1表示拦截该Signal,即不处理Signal;掩码值为0表示会处理该Signal。而且默认情况下每个Task都会处理发给自己的Signal,只不过默认的处理方案是SIG_IGN(丢弃/忽略)。因此,要对Signal有所反应,就需要手动挂接Signal的处理机制了。今天看看Mask相关的操作
1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。
今天查一个问题,SIGWINCH的处理函数一直不执行,耽搁了不少时间,最后发现是另外一个地方也设置了,处理函数是另外的。。。。
大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【中断程序如何发送信号给应用层】。
一、函数原型:sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)
文章转自:http://www.osyunwei.com/archives/8998.html
[root@VM-8-35-centos /data/server/fatp_dw_base]# kill -l
父子进程间交互执行是指用一种同步原语,实现父进程和子进程在某一时刻只有一个进程执行,之后由另外一个进程执行,用一段代码举例如下:
$ man nginx NGINX(8) BSD System Manager's Manual NGINX(8) NAME
当你编写程序,想要屏蔽某个或多个信号的时候,那么我们就会用到PHP扩展中的pcntl_sigprocmask函数,这个函数就是用于设置信号屏蔽字的函数,第一个参数就是可以是否设置屏蔽信号字,SIG_BLOCK 是设置,SIG_UNBLOCK是移除不设置 第二个参数就是你要设置屏蔽的信号集合数组,第三个参数是返回之前设置屏蔽的信号集数组
当我们使用kill命令发送或者在终端按下ctrl+c时,我们编写的中断处理函数就会收到中断信号
是的,他的昵称真的就叫图灵,一开始我以为是图灵出版社的人...他是《PHP网络编程》的阅读者,由于比较读的比较认真仔细,所以他问了一些问题,你们感受一下。
比如,有时候,我们把程序放在后台了,希望其输出也进行保存,而不是混乱而无序的输出到前台,我们就可以使用重定向。
感兴趣的同学可以查看此链接 http://io.upyun.com/2017/08/19/nginx-signals/
这篇文章是对之前一篇文章的补充和改进, 创建一个主(master)进程,主进程安装定时器,每隔5分钟检测一次队列长度,根据队列长度计算需要的worker进程,
对于更难发现的问题,rsyslog具有集成的调试支持。通常,这不是发现配置问题所必需的,而是用来寻找程序或插件错误的。但是,在许多情况下,事实证明调试日志对于发现配置问题很有帮助。
上一篇文章中,我们看到了如何通过 multiprocessing 来创建子进程。 通过 multiprocessing 实现 python 多进程
SIGABRT是中止一個程序,它可以被捕捉,但不能被阻塞。處理函數返回后,所有打開的文件描述符將會被關閉,流也會被flush。程序會結束,有可能的話還會core dump。 當程序調用abort(3)時,該進程會向自己發送SIGABRT信號。所以,SIGABRT一般用於信號中一些關鍵的處理,assert失敗時也會使用它。你不應該去捕捉SIGSEGV和SIGABRT信號,如果收到這種信號,說明進程處於一個不確定的狀態,很可能會直接掛起。
我们可能都使用过 docker stop 命令来停止正在运行的容器,有时可能会使用 docker kill 命令强行关闭容器或者把某个信号传递给容器中的进程。这些操作的本质都是通过从主机向容器发送信号实现主机与容器中程序的交互。比如我们可以向容器中的应用发送一个重新加载信号,容器中的应用程序在接到信号后执行相应的处理程序完成重新加载配置文件的任务。本文将介绍在 docker 容器中捕获信号的基本知识。
昨天下午的时候,一台引流测试机器的一个 ngx_lua 服务突然出现了一些 HTTP/500 响应,从错误日志打印的堆栈来看,是不久前新发布的版本里添加的一个 Lua table 不存在,而有代码向其进行索引导致的。这令人百思不得其解,如果是版本回退导致的,那么为什么使用这个 Lua table 的代码没有被回退,偏偏定义这个 table 的代码被回退了呢?
领取专属 10元无门槛券
手把手带您无忧上云