当系统区内存不能再申请新进程的时候申请会失败

在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 - 守护进程再次分裂子进程的更多相关文章

  1. Linux Guard Service - 守护进程分裂

    分裂守护进程 由于fork()后第一行仍然在循环中,使用fork()返回值鉴别当前进程的性质 int i = 0; for (i = 0; i < 10; i++) { // sleep(1); ...

  2. Linux Guard Service - 守护进程的作用、用途、父进程标识的特点

    让test2直接成为守护进程 [root@localhost 02]# cat test2.c //test2 #include<stdio.h> #include<unistd.h ...

  3. linux下的守护进程daemon

    什么是守护进程?其实感觉守护进程并没有什么明确的定义,只是守护进程有一些特征,这是它需要遵循的. 守护进程的第一个特征是长时间在后台运行的程序,并且主要是为了提供某种服务,而为了能够让服务尽可能随时都 ...

  4. Linux Guard Service - 进程分裂与脱离

    进程分裂更名 void set_ps_name(char *name) { prctl(PR_SET_NAME, name); } 修改进程长名称 备份进程环境变量空间 for (i = 1; i & ...

  5. Linux Guard Service - 杀死守护进程

    杀死某个子进程 杀死守护进程的子进程后,改进程会变为僵尸进程 14087 ? Ss 0:00 ./test4-1 14088 ? S 0:00 \_ ./test4-1 14089 ? S 0:00 ...

  6. Linux 中的 守护进程

    什么是守护进程 脱离控制终端的,运行于后端的进程,由系统管理的,按计划自动启动/停止/重启,用以执行特定的任务. 为什么要有守护进程? 在某些需求场景下,我们希望某项系统任务能够按计划按预期,始终/自 ...

  7. linux下daemon守护进程的实现(以nginx代码为例)

    ngx_int_t ngx_daemon(ngx_log_t *log) { int fd; // 让init进程成为新产生进程的父进程: // 调用fork函数创建子进程后,使父进程立即退出.这样, ...

  8. Linux编程实现守护进程

    Linux 守护程序 守护进程(Daemon)它是在一个特定的过程的背景进行.它独立于控制终端的和周期性地执行某些任务或待某些事件.是一种非常实用的进程. Linux的大多数server就是用守护进程 ...

  9. linux中的守护进程

    概念Daemon(精灵)进程,是Linux中的后台服务进程,生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.模型守护进程编程步骤1. 创建子进程,父进程退出所有工 ...

随机推荐

  1. C++ 函数特性_参数默认值

    函数参数默认值写法 有默认参数值的参数必须在参数表的最右边 ,) // 这是正确的写法 , int k) // 这是错误写法 先声明,后定义 在写函数时要先在代码前面声明,然后再去定义. 函数默认参数 ...

  2. yaml语言教程

    大家直接去看阮一峰的教程. http://www.ruanyifeng.com/blog/2016/07/yaml.html?f=tt 简介 基本语法规则: 大小写敏感 使用缩进表示层级关系 缩进时不 ...

  3. TreeSet函数

    TreeSet类的排序问题   TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默认采用自然排序. 1.自然排序 TreeSet会调用集合元素的compareTo(Object ob ...

  4. sort+函数指针、sort+比较器对象、qsort速度比较

    一.上代码 #include<bits/stdc++.h> using namespace std; #define MAXN 50000000 struct TS { int a, b, ...

  5. JVM实例以及内存的分配机制

    JVM:一台用来模拟计算机执行计算指令的虚拟计算机,拥有自己的指令,指令执行环境,虚拟内存等. 下面介绍虚拟机(JVM)--cpu,寄存器,内存,指令 ======================== ...

  6. http和https(转)

    一.HTTP协议 最近看了一些网络通信方面的书籍,研究了一下 HTTP 和 TCP/IP,有了一些新的收获和理解,在这里做个归纳和总结. (1)什么是HTTP协议 HTTP (HyperText Tr ...

  7. LUA 表排序

    t = { [] = , [] = , [] = } for k, v in pairs(t) do--注意这个输出顺序是没有规律的!!! print(k, v) end local keys = { ...

  8. SQL优化的部分内容

    为什么要优化:      随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们         就需要做一个优化调整.   数据库优化这个课题较 ...

  9. PHP ImageMagick

    简介:       ImageMagick是用C语言开发图片处理程序.可以对图片进行改变大小.旋转.锐化.减色或增加特效等操作.对图片的操作,即可以通过命令行进行,也可以用C/C++.Perl.Jav ...

  10. 可跨平台C++开源图形图像框架:openFrameworks

    博客参考:https://www.hahack.com/codes/openframeworks-intro/#%E4%BB%80%E4%B9%88%E6%98%AF-openframeworks 和 ...