fork 和 sigchld 坑

最近有个项目,一个deamon进程,一个干活进程。deamon 进程会捕获SIGCHLD信号如果干活进程down掉了,deamon会收到这个信号并且重新fork干活进程。

最近发现一个问题是 deamon进程fork了好几个干活进程。团队的人调查问题,一度怀疑是不同的linux内涵对信号处理不同。后来我发现如果干活进程调用了system函数,system会fork一个子进程,这个子进程昨晚事情就退出了,导致deamon进程收到一次SIGCHLD信号。

时间: 2024-11-11 18:02:26

fork 和 sigchld 坑的相关文章

Linux中fork,vfork和clone详解(区别与联系)

fork,vfork,clone Unix标准的复制进程的系统调用时fork(即分叉),但是Linux,BSD等操作系统并不止实现这一个,确切的说linux实现了三个,fork,vfork,clone(确切说vfork创造出来的是轻量级进程,也叫线程,是共享资源的进程) 系统调用 描述 fork fork创造的子进程是父进程的完整副本,复制了父亲进程的资源,包括内存的内容task_struct内容 vfork vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程

进程创建函数fork()、vfork() ,以及excel()函数

一.进程的创建步骤以及创建函数的介绍 1.使用fork()或者vfork()函数创建新的进程 2.条用exec函数族修改创建的进程.使用fork()创建出来的进程是当前进程的完全复制,然而我们创建进程是为了让新的进程去执行新的程序,因此,就需要用到exec函数族对创建出来的新进程进行修改,让他拥有和父进程不一样的东西,修改后就可以执行新的程序,当然,修改后的子进程包含了要执行程序的信息. 在Linux中,fork()和vfork()就是用于创建进程的两个函数,他们的相关信息如下: 创建进程函数:

android MultiDex multidex原理原理下遇见的N个深坑(二)

android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑. 不了解的可以先看上篇文章:android MultiDex multidex原理(一) 解决和遇到的其它问题,请见下一篇文章:android MultiDex 原理下超出方法数的限制问题(三) 遭遇multidex  愉快地写着Android代码的总悟君往工程里引入了一个默默无闻的jar然后Run了一下~~~~ 经过漫长的等待AndroidStudio构建失败了.于是

PYTHON多进程并发WEB服务器(利用LINUX的FORK)

这个又牛X 一点点.. 这还不涉及IO,如果调用GEVENT之类作异步IO或非阻塞IO,那就大框架都有啦.. ##################################################################### # Iterative server - webserver3a.py # # # # Tested with Python 2.7.9 & Python 3.4 on Ubuntu 14.04 & Mac OS X # ###########

多进程-多客户socket出现fork: Resource temporarily unavailable

问题描述 多客户socket出现fork: Resource temporarily unavailable server端代码如下: #include #include #include #include #include #include #include #include #include #include "multiple_socket.h" int main() { int server_sockfd,client_fd; struct sockaddr_in server

Linux下套接字详解(五)----基于fork多进程的TCP套接字(阻塞/同步/并发)

简介 一个简单的改进方案是在服务器端使用多线程(或多进程).多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接.具体使用多进程还是多线程,并没有一个特定的模式.传统意义上,进程的开销要远远大于线程,所以如果需要同时为较多的客户机提供服务,则不推荐使用多进程:如果单个服务执行体需要消耗较多的CPU资源,譬如需要进行大规模或长时间的数据运算或文件访问,则进程较为安全.通常,使用pthread_create ()创建新线程,fork()创建新进程

linux下的僵尸进程处理SIGCHLD信号

什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息. 而僵尸进程就是指:一个进程执行了exit系统调用退出,而其父进程并没有为它收尸(调用wait或waitpid来获得它的结束状态)的进程. 任何一个子进程(init除外)在exit后并非马上就消失,而是留

C程序fork进程导致PHP执行不退出

/********************************************************************* * C程序fork进程导致PHP执行不退出 * 说明: * 由于测试的GPIO程序需要持续运行,而主进程需要处理其他事务但退出时 * 由于子线程未结束导致PHP系统调用函数不退出,解决办法是双重fork(第一次 * fork产生子进程用于kill掉让第二次fork出的子进程变成孤儿进程),并将最终 * 的子进程转换为守护进程,从而不影响PHP获取主进程数据

我在写串口通信程序遇到的坑

我在做基于HC6800的51单片机上,写串口通信程序遇到了许多坑. 一个大坑:为什么HC6800上U转串口不能发送数据. 因为我们向HC6800烧程序都是使用图1所示的软件,所以我想当然地认为可以直接通过HC6800上的U转串进行串口通信,而我的同学信誓旦旦地告诉我可以.坑爹.并且这个软件好像也在提示可以用直接用U转串,进行串口通信(见图2).但是当我打开串口调试助手的时候(如图3),却发现单片机掉电了(如图4).其实HC6800上有另一个串口的,我们只要把连接图5黄框处串口.并且在图4中的6处