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. 创建子进程,父进程退出所有工 ...
随机推荐
- java websocket @ServerEndpoint注解说明
http://www.blogjava.net/qbna350816/archive/2016/07/24/431302.html https://segmentfault.com/q/1010000 ...
- 走迷宫(用队列bfs并输出走的路径)
#include <iostream> #include <stack> #include <string.h> #include <stdio.h> ...
- Eutils用法总结
好久没更新了,这里都长草了... 总结下Eutils的用法,参考<E-utilities Quick Start>,没时间看英文的可以参考下. 简介 Eutils全称是The Entrez ...
- Java 8 字符串日期排序
public class ObjectDto implements Serializable { private static final long serialVersionUID = 858983 ...
- 「小程序JAVA实战」小程序开源搜索组件(53)
转自:https://idig8.com/2018/09/22/xiaochengxujavashizhanxiaochengxukaiyuansousuozujian52/ 上次说了可以在视频中通过 ...
- idea git 操作
工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...
- Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的
参考mybatis入门基础(二)----原始dao的开发和mapper代理开发 其实也就是通过接口名与mapper的id绑定在一起,通过SQL去写实现类,返回数据.
- PHP中的各种POST或GET请求
1.表单<form> 2.fsockopen(); 3.jquery语法: $.post ($.ajax的简写) 示例代码: <!DOCTYPE html> <html& ...
- 创建Kafka0.8.2生产者与消费者
一.下载安装Kafka0.8.2 二.vi config/server.properties 三.修改为advertised.host.name=192.168.1.76 四.rm -rf /tmp ...
- static 与 extern 关键字描述说明
使用static 定义的变量和函数只能用于本模块即为本文件 使用extern 定义的变量和函数可以用于其他模块的引用