Linux Guard Service - 守护进程再次分裂子进程

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

在512MB内存下最多分配的子进程数

3331

[[email protected] 05]# ./test5-1 50000
expect 50000 sub process
[[email protected] 05]# 1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
pid attribute failed!
Total sub process 3331 

[[email protected] 05]# pkill test5-1

在1024MB内存下最多分配的子进程数

7364

[[email protected] 05]# ./test5-1 50000
expect 50000 sub process
[[email protected] 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
[[email protected] 05]# 

在1024MB内存下最多分配的子进程数

14106

[[email protected] 05]# ./test5-1 50000
expect 50000 sub process
[[email protected] 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访问困难,例如

[[email protected] 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等将不能正常显示

原文地址:https://www.cnblogs.com/liutianchen/p/8503539.html

时间: 2024-10-07 03:37:29

Linux Guard Service - 守护进程再次分裂子进程的相关文章

linux下的守护进程daemon

什么是守护进程?其实感觉守护进程并没有什么明确的定义,只是守护进程有一些特征,这是它需要遵循的. 守护进程的第一个特征是长时间在后台运行的程序,并且主要是为了提供某种服务,而为了能够让服务尽可能随时都可用,就要求这个服务是一直运行的,于是守护进程就守护着这个服务不挂掉.linux里面常见的守护进程一般都是以d结尾的,比如apache的httpd,samba的smbd,ssh的sshd. 它的第二个特征是与启动它的进程的环境隔离,包括关闭它打开的所有文件描述符,终端,会话,进程组,某些环境变量(如

linux下服务器守护进程的安装

一.在服务器上安装rstatd守护进程安装步骤:1. 从网上下载rstatd2. 将该文件放到/home/user目录下3. chmod 777 rpc.rstatd----改变该文件读写的权限,拥有所有权限.4. chmod 777 configure ---同上5. ./configure ---配置6. make ---编译7. make install ---安装8. rpc.rstatd ---启动rstatd进程二.在lr中配置从LR里面add measurement, 填写linu

linux应用开发-守护进程

linux应用开发-守护进程 linux应用开发-守护进程 一 守护进程 默认的后台运行的进程 二 与安卓的服务相关联 三 守护进程编写 1 脱离控制终端tty,让父进程为init 2 禁止进程重新打开控制终端 3 重新开启会话setsid(); 4 关闭打开的文件描述符,进程从创建它的父进程哪里继承了打开的文件描述符 ,若不关闭,将会造成资源浪费,造成进程所在的文件系统无法卸下以及引起无法预料的错误 可以使用for循环关闭 for (i = 0 ; i < 文件描述符的个数; i++) { c

Linux Guard Service - 进程分裂与脱离

进程分裂更名 void set_ps_name(char *name) { prctl(PR_SET_NAME, name); } 修改进程长名称 备份进程环境变量空间 for (i = 1; i < argc; i++) { argv_new[i] = strdup(argv[i]); } char **new_environ = malloc(env_len * sizeof(char *)); if (environ) { unsigned int i = -1; while (envir

Linux Guard Service - 杀死守护进程

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

Linux编程实现守护进程

Linux 守护程序 守护进程(Daemon)它是在一个特定的过程的背景进行. 事件.守护进程是一种非常实用的进程. Linux的大多数server就是用守护进程实现的. 比方,Internetserverinetd,Webserverhttpd等. 同一时候,守护进程完毕很多系统任务.比方.作业规划进程crond,打印进程lpd等. 守护进程的编程本身并不复杂,复杂的是各种版本号的Unix的实现机制不尽同样.造成不同Unix环境下守护进程的编程规则并不一致.这须要读者注意,照搬某些书上的规则(

linux下python守护进程编写和原理理解

原文地址: http://www.01happy.com/linux-python-daemon/ 守护进程英文为daemon,像httpd.mysqld.vsftpd最后个字母d其实就是表示daemon的意思. 守护进程的编写步骤: fork子进程,而后父进程退出,此时子进程会被init进程接管. 修改子进程的工作目录.创建新进程组和新会话.修改umask. 子进程再次fork一个进程,这个进程可以称为孙子进程,而后子进程退出. 重定向孙子进程的标准输入流.标准输出流.标准错误流到/dev/n

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

ngx_int_t ngx_daemon(ngx_log_t *log) { int fd; // 让init进程成为新产生进程的父进程: // 调用fork函数创建子进程后,使父进程立即退出.这样,产生的子进程将变成孤儿进程,并被init进程接管, // 同时,所产生的新进程将变为在后台运行. switch (fork()) { case -1: ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed"); return

linux中的守护进程

//一.守护进程 守护进程,也叫精灵进程(daemon) 它和普通后台进程的区别在于以下三点 1.守护进程自成会话,而普通后台进程则不一定 2.守护进程不受终端的控制 3.守护进程就是后台进程,而后台进程不同于守护进程 用ps axj命令查看系统中的进程,TPGID一栏为 -1 的进程(这些进程没有控制终端)就是守护进程. //二.实现 创建守护进程的步骤如下: 1.调用umask把[文件模式创建屏蔽字] 设置为 0 由于 umask 接收的参数会被取反,所以这个 0 传进去取反以后是最大的,也