Linux Guard Service - 守护进程再次分裂子进程
当系统区内存不能再申请新进程的时候申请会失败
在512MB内存下最多分配的子进程数
3331
[root@localhost 05]# ./test5-1 50000
expect 50000 sub process
[root@localhost 05]# 1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
pid attribute failed!
Total sub process 3331
[root@localhost 05]# pkill test5-1
在1024MB内存下最多分配的子进程数
7364
[root@localhost 05]# ./test5-1 50000
expect 50000 sub process
[root@localhost 05]# 1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
pid attribute failed!
Total sub process 7364
pkill test5-1
[root@localhost 05]#
在1024MB内存下最多分配的子进程数
14106
[root@localhost 05]# ./test5-1 50000
expect 50000 sub process
[root@localhost 05]# 1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
pid attribute failed!
Total sub process 14106
由于子进程和父进程共享fork()之间的部分变量,所以在子进程中记录最大pid能够在父进程中读取。
last_pid=getpid();
......
fprintf(pfile,"mainline staying\n");
让小内存条件下的系统下分裂超量的子进程
使用排队的方法,等待旧的进程等待完毕后使用
signal(SIGCHLD,SIG_IGN);
自动释放,然后在父进程中
while(pid<0){
sleep(1);
printf("Waiting old process abort...\n");
pid=fork();
}
保持等待,就能排队申请完所有进程
如果进程是系统级的,排队时可能导致-bash访问困难,例如
[root@localhost 05]# pkill test5-2
这种多线程指令可能会出现短期内无法响应的情况(提示bash fork),但是指令会被保存在终端输入队列,操作系统会“伺机”完成这条指令
使用两个变量记录释放子进程和回收子进程
如果要记录释放子进程的数量,则不能再使用信号通道函数,改用
pid_t waitpid(-1,NULL,WNOHANG);
在父进程的死循环内,反复设置这个函数用以回收僵尸进程
else{
printf("Total sub process %d \n",att);
printf("last pid is %d\n",pid);
while(1){
if(waitpid(-1,NULL,WNOHANG)>0) sub_abor++;
printf("sub attr:%d, sub abor:%d\n",sub_attr,sub_abor);
pfile=fopen("test5-1.log","a");
fprintf(pfile,"mainline staying\n");
fclose(pfile);
sleep(1);
}
}
在极限操作后,Linux系统还能正常工作吗?
Redhat是可以正常工作的,只是相应的队列操作的相应在内存不足的情况下所有输入队列需要排队。在内存响应来不及的情况下,-bash进程会把操作放入队列中,伺机把指令送入系统执行。送入失败则等待下一次尝试,尝试多次之后可能出现资源无法使用的情况。因此可以说操作有可能丢失。(键盘上的非ANSI按键如方向键,Backspace等将不能正常显示)
Linux Guard Service - 守护进程再次分裂子进程的更多相关文章
- Linux Guard Service - 守护进程分裂
分裂守护进程 由于fork()后第一行仍然在循环中,使用fork()返回值鉴别当前进程的性质 int i = 0; for (i = 0; i < 10; i++) { // sleep(1); ...
- Linux Guard Service - 守护进程的作用、用途、父进程标识的特点
让test2直接成为守护进程 [root@localhost 02]# cat test2.c //test2 #include<stdio.h> #include<unistd.h ...
- linux下的守护进程daemon
什么是守护进程?其实感觉守护进程并没有什么明确的定义,只是守护进程有一些特征,这是它需要遵循的. 守护进程的第一个特征是长时间在后台运行的程序,并且主要是为了提供某种服务,而为了能够让服务尽可能随时都 ...
- Linux Guard Service - 进程分裂与脱离
进程分裂更名 void set_ps_name(char *name) { prctl(PR_SET_NAME, name); } 修改进程长名称 备份进程环境变量空间 for (i = 1; i & ...
- Linux Guard Service - 杀死守护进程
杀死某个子进程 杀死守护进程的子进程后,改进程会变为僵尸进程 14087 ? Ss 0:00 ./test4-1 14088 ? S 0:00 \_ ./test4-1 14089 ? S 0:00 ...
- Linux 中的 守护进程
什么是守护进程 脱离控制终端的,运行于后端的进程,由系统管理的,按计划自动启动/停止/重启,用以执行特定的任务. 为什么要有守护进程? 在某些需求场景下,我们希望某项系统任务能够按计划按预期,始终/自 ...
- linux下daemon守护进程的实现(以nginx代码为例)
ngx_int_t ngx_daemon(ngx_log_t *log) { int fd; // 让init进程成为新产生进程的父进程: // 调用fork函数创建子进程后,使父进程立即退出.这样, ...
- Linux编程实现守护进程
Linux 守护程序 守护进程(Daemon)它是在一个特定的过程的背景进行.它独立于控制终端的和周期性地执行某些任务或待某些事件.是一种非常实用的进程. Linux的大多数server就是用守护进程 ...
- linux中的守护进程
概念Daemon(精灵)进程,是Linux中的后台服务进程,生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.模型守护进程编程步骤1. 创建子进程,父进程退出所有工 ...
随机推荐
- Map和Bean的相互转换
Map和Bean的相互转换 BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下: 完整方法: BeanUtil ...
- oracle 跨库访问
创建DBLINK的方法: 1. create public database link dblink connect to totalplant identified by totalplant us ...
- 在SUSE Linux Enterprise 11 SP1上用UDEV SCSI配置ASM
1. 编辑/etc/scsi_id.config文件,如果该文件不存在,则创建该文件,添加如下行: options=–whitelisted –replace-whitespace 2. 获取需要绑定 ...
- C关系运算结果及逻辑运算结果保存
http://service.exmail.qq.com/
- angularjs中的$http详解
语法: 要将区别先弄清$http服务,它是对原生XMLHttpRequest对象的简单封装,是只能接受一个参数的方法, 这个方法会返回一个promise对象,具有sccess和error两个方法.当然 ...
- windows下使用nginx配置tomcat集群
转自:https://blog.csdn.net/csdn15698845876/article/details/80658599
- asp.net 初级程序员面试题【待续】
C# 常见的排序方式 冒泡排序(Bubble sort) 堆排序(Heap sort) 插入排序(Insertion sort) 归并排序(Merge sort) 快速排序(Quick sort) ...
- StretchBlt
StretchBlt 函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩以满足目标矩形的尺寸. 原型: BOOL StretchBlt( HDC hdcDest ...
- Django+python实现网页数据的excel导出
一直都想做一个网页的excel导出功能,最近抽时间研究了下,使用urllib2与BeautifulSoup及xlwt模块实现 urllib2这个模块之前有用过,关于BeautifulSoup模块,可参 ...
- Docker构建redis cluster集群
准备工作 安装gcc ruby 解压编译redis Redis 是 c 语言开发的.安装 redis 需要 c 语言的编译环境.如果没有 gcc 需要在线安装. yum install gcc-c++ ...