Webserver(2.4)进程控制

news2024/11/7 1:39:38

目录

  • 进程退出
  • 孤儿进程
  • 僵尸进程
  • wait函数
  • waitpid函数

进程退出

exit 刷新IO缓冲区
_exit

孤儿进程

父进程运行结束,但子进程还在运行,这样的子进程称为孤儿进程。
每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。init进程会在孤儿进程结束后处理它的善后工作,因此孤儿进程并不会有什么危害

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(){

    //创建子进程
    pid_t pid=fork();

    //判断,判断是父进程还是子进程
    if(pid>0){

        //如果大于0,返回的是创建的子进程的进程号,当前是父进程
        printf("i am parent process,pid :%d,ppid:%d\n",getpid(),getppid());
    }else if(pid==0){
        sleep(1);
        //当前是子进程
        printf("i am child process,pid:%d,ppid:%d\n",getpid(),getppid());
        
    }

    //for循环
    for(int i=0;i<3;i++){
        printf("i:%d,pid:%d\n",i,getpid());
    }


    return 0;
}

子进程的父进程的Id变成了1,孤儿进程的父进程会给进程号为1 的Init
在这里插入图片描述
那为什么又出现终端信息了呢?
因为父进程结束之后,切换到前台,然后子进程还有输出,继续输出出来,

僵尸进程

相对于无害的孤儿进程,僵尸进程比较麻烦和可怕
每个进程结束之后,都会释放自己地址空间中的用户区数据,内核区的PCB没有办法自己释放掉,需要父进程去释放。
进程终止时,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸进程
僵尸进程不能被kill -9杀死
这样就会导致一个问题,如果父进程不调用wait()或waitpid()的话,那么保留的那段信息就不会释放,但是系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程,此即为僵尸进程的危害,应当避免
因此父进程必须去释放子进程的资源。
僵尸进程是子进程都死了,父进程没有去回收资源

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(){

    //创建子进程
    pid_t pid=fork();

    //判断,判断是父进程还是子进程
    if(pid>0){
        while(1){
            //如果大于0,返回的是创建的子进程的进程号,当前是父进程
            printf("i am parent process,pid :%d,ppid:%d\n",getpid(),getppid());
            sleep(1);
        }

        
    }else if(pid==0){

        //当前是子进程
        printf("i am child process,pid:%d,ppid:%d\n",getpid(),getppid());
        
    }

    //for循环
    for(int i=0;i<3;i++){
        printf("i:%d,pid:%d\n",i,getpid());
    }


    return 0;
}

在这里插入图片描述
Z+的状态就是僵尸进程,仍占据一个进程号,然而进程号是有限的
在这里插入图片描述
僵尸进程无法被kill -9 进程号杀死,因为他不是一个正常的进程
父进程用ctrl+c结束,杀死
在这里插入图片描述
而在正式的开发中,无法这样结束父进程,一般调用wait()和waitpid()函数来结束

wait函数

父进程通过wait得到它的退出状态同时彻底清除掉这个进程
等待子进程结束之后,回收它的资源

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(){

    //有一个父进程,创建5个子进程(兄弟)
    pid_t pid;

    
    for(int i=0;i<5;i++){
        pid=fork();
        if(pid==0){
            break;
        }
    }
    if(pid>0){
        //父进程
        while(1){
            printf("parent,pid=%d\n",getpid());
            int st;
            int ret =wait(&st);
            

            if(ret==-1){
                break;
            }

            if(WIFEXITED(st)){
                //是不是正常退出
                printf("退出的状态码:%d\n",WEXITSTATUS(st));
            
            }
            if(WIFSIGNALED(st)){
                //是不是异常终止
                printf("被那个信号干掉了:%d\n",WTERMSIG(st));
            }
            printf("child die,pid=%d\n",ret);
            sleep(1);
        }
        
    }else if(pid==0){
        //子进程
        // while(1){
        printf("child,pid=%d\n",getpid());
        sleep(1);
        //}
        exit(0);
        
    }
    return 0;
}

在这里插入图片描述
目前有5个僵尸进程
wait函数就是会阻塞在那,如果有一个进程被回收了,会运行一次,然后继续运行。
在这里插入图片描述

waitpid函数

阻塞就是在等待某些条件触发之后再运行
使用了waitpid之后,即使子进程未执行完,父进程仍可以执行自己的业务逻辑,但是wait的话,父进程就会暂停等到子进程回收之后再继续运行一次。

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(){

    //有一个父进程,创建5个子进程(兄弟)
    pid_t pid;

    
    for(int i=0;i<5;i++){
        pid=fork();
        if(pid==0){
            break;
        }
    }
    if(pid>0){
        //父进程
        while(1){
            printf("parent,pid=%d\n",getpid());
            sleep(1);
            int st;
            int ret =waitpid(-1,&st,WNOHANG);
            

            if(ret==-1){
                break;
            }

            if(ret==0){
                //说明还有子进程存在
                continue;
            }else if(ret>0){
                if(WIFEXITED(st)){
                //是不是正常退出
                printf("退出的状态码:%d\n",WEXITSTATUS(st));
            
            }
                if(WIFSIGNALED(st)){
                    //是不是异常终止
                    printf("被那个信号干掉了:%d\n",WTERMSIG(st));
                }
                printf("child die,pid=%d\n",ret);
                

            }
            

            
        }
        
    }else if(pid==0){
        //子进程
        while(1){
            printf("child,pid=%d\n",getpid());
            sleep(1);
        }
        exit(0);
        
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UART-通用异步收发器

1. UART的基本工作原理 UART通信主要有两个部分构成&#xff1a;发送器和接收器&#xff0c;也就是我们常见的&#xff08;RX接收&#xff0c;TX发送&#xff09;两个独立的线路来实现数据的双向传输&#xff0c;由于是异步的&#xff0c;UART并不需要时钟信号&#xff0c;而是…

linux 互斥锁

首先是概念 互斥锁是可以休眠的。 所以不能在中断中使用&#xff0c; 在中断中只能使用 自旋锁。 然后是 函数&#xff1a; 然后是 open 如果以 NONBLOCK 打开&#xff0c; 遇到 互斥锁怎么办&#xff1f; 总结一下&#xff1a; 1 open() 函数的 阻塞与不阻塞的标志&#…

第72期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

[ 应急响应靶场实战 ] VMware 搭建win server 2012应急响应靶机 攻击者获取服务器权限上传恶意病毒 防守方人员应急响应并溯源

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Linux运维高手工具全集及功能分类:20+必备神器

文章目录 Linux运维高手工具全集及功能分类&#xff1a;20必备神器一、系统管理与配置1.1 Shell1.2 Ansible1.3 Puppet1.4 Chef 二、监控与告警2.1 Prometheus2.2 Grafana2.3 Zabbix2.4 Nagios2.5 ELK Stack&#xff08;Elasticsearch, Logstash, Kibana&#xff09; 三、容器与…

安卓APP开发中,如何使用加密芯片?

加密芯片是一种专门设计用于保护信息安全的硬件设备&#xff0c;它通过内置的加密算法对数据进行加密和解密&#xff0c;以防止敏感数据被窃取或篡改。如下图HD-RK3568-IOT工控板&#xff0c;搭载ATSHA204A加密芯片&#xff0c;常用于有安全防护要求的工商业场景&#xff0c;下…

什么是x86架构,什么是arm架构

什么是 x86 架构&#xff1f; x86 架构是一种经典的指令集架构&#xff08;ISA&#xff09;&#xff0c;最早由英特尔在 1978 年推出&#xff0c;主要用于 PC、服务器等领域。 它是一种复杂指令集计算&#xff08;CISC&#xff09;架构&#xff0c;支持大量的复杂指令和操作&…

知识分享 | SNP检测试剂盒开发注意事项及启衡星CDMO案例分享

一、SNP检测方法 常规有阵列的杂交、qPCR和测序等多种方法&#xff0c;其中基于qPCR方法的SNP检测试剂盒因具有快速、简便的优势&#xff0c;已有大量检测试剂盒上市。如&#xff1a;人CYP2C9和VKORC1基因检测试剂盒、人类SLCO1B1和ApoE基因分型检测试剂盒、人ADRB1&#xff0…

详解varint,zigzag编码, 以及在Go标准库中的实现

文章目录 为啥需要varint编码为啥需要zigzag编码varint编码解码 zigzag编码解码 局限性 为啥需要varint编码 当我们用定长数字类型int32来表示整数时&#xff0c;为了传输一个整数1&#xff0c;我们需要传输00000000 00000000 00000000 00000001 32 个 bits&#xff0c;而有价…

又一部神作登场,MTC高分8.8认证,堪称年度佳片

威尼斯电影节上&#xff0c;布拉迪科贝特导演的新作《粗野派》大放异彩。这部电影&#xff0c;不仅在现场收获了观众的真诚掌声&#xff0c;甚至被不少专业影评人评为“2024年度最佳电影”&#xff0c;而这个评价背后&#xff0c;是一部作品真正打动人心的力量。 布拉迪科贝特&…

低代码平台如何通过AI赋能,实现更智能的业务自动化?

引言 随着数字化转型的加速推进&#xff0c;企业在日常运营中面临的业务复杂性与日俱增。如何快速响应市场需求&#xff0c;优化流程&#xff0c;并降低开发成本&#xff0c;成为各行业共同关注的核心问题。低代码平台作为一种能够快速构建应用程序的工具&#xff0c;因其可视化…

进程、孤儿进程、僵尸进程、fork、wait简介

进程相关概念 程序和进程 程序&#xff1a;是指编译好的二进制文件&#xff0c;在磁盘上&#xff0c;占用磁盘空间, 是一个静态的概念. 进程&#xff1a;一个启动的程序&#xff0c; 进程占用的是系统资源&#xff0c;如&#xff1a;物理内存&#xff0c;CPU&#xff0c;终端等…

已解决:VS2022一直显示编译中但无法运行的情况

本问题已得到解决&#xff0c;请看以下小结&#xff1a; 关于《VS2022一直显示编译中但无法运行的情况》的解决方案 记录备注报错时间2024年报错版本VS2022报错复现突然VS2022不能启动&#xff0c;一直显示编译中&#xff0c;取消重试无效&#xff0c;重新生成解决方案无效报错…

12. MapReduce全局计数器

一. 计数器概述 在执行MapReduce程序时&#xff0c;控制台的输出中一般会包含如下内容。 这些输出就是MapReduce的全局计数器的输出信息。计数器是用来记录job的执行进度和状态的&#xff0c;它的作用可以理解为日志&#xff0c;方便用户了解任务的执行状况&#xff0c;辅助…

Springboot集成阿里云通义千问(灵积模型)

我这里集成后&#xff0c;做成了一个工具jar包&#xff0c;如果有不同方式的&#xff0c;欢迎大家讨论&#xff0c;共同进步。 集成限制&#xff1a; 1、灵积模型有QPM(QPS)限制&#xff0c;每个模型不一样&#xff0c;需要根据每个模型适配 集成开发思路&#xff1a; 因有…

今年双11,拼多多吹“新”风

文 | 螳螂观察 作者 | 陈小江 这届双11真变了。 以前提到双11&#xff0c;不管平台、商家全都盯着价格。但今年不一样。这届双11给出了新解法——平台不再把“我的价格比你低”挂在嘴边&#xff0c;转而更关心消费者体验和为商家减负。 双11这艘大船&#xff0c;在航行到第…

005 IP地址的分类

拓扑结构如下 两台主机处于同一个网关下&#xff0c;通过ping命令检测&#xff0c;可以连通 &nbps; 拓扑结构如下 使用ping 检查两台电脑是否相通, 因为网络号不一样&#xff0c;表示两台电脑不在同一个网络&#xff0c;因此无法连通 拓扑结构如下 不在同一网络的PC要相…

记本地第一次运行seatunnel示例项目

前置 静态源码编译通过&#xff1a;https://blog.csdn.net/u011924665/article/details/143372464 参考 seatunnel官方的开发环境搭建文档&#xff1a;https://seatunnel.incubator.apache.org/zh-CN/docs/2.3.5/contribution/setup 安装scala 下载scala 去官网下载&…

《暗河传》 顺利杀青,苏棋演绎“千面鬼”慕婴引期待

近日&#xff0c;由龚俊、彭小苒、常华森、杨雨潼等一众优秀演员出演的古装武侠剧《暗河传》顺利杀青&#xff0c;00后小花苏棋饰演的“千面鬼”慕婴一角也收获了许多关注的目光。 《暗河传》凭借其精彩的剧情和庞大的粉丝基础&#xff0c;自开拍起便备受关注。在剧中&#xff…

推荐一个没有广告,可以白嫖的产品宣传册转换翻页电子书的网站

​随着数字化时代的到来&#xff0c;传统的纸质宣传册逐渐被电子书所取代。为了满足企业和个人对高效、便捷的电子宣传册制作需求&#xff0c;许多在线平台应运而生。今天&#xff0c;就让我为您推荐一个无需广告干扰、完全免费使用的在线宣传册转换翻页电子书网站——【FLBOOK…