Linux进程的讲解(僵尸进程、孤儿进程)

2023-11-08

进程

程序就是你编译过后产生的那个文件,进程就是打开程序过后产生的。

fork vfork exit execl
system popen 孤儿进程 僵尸进程
wait fork1

getpid/getppid区别

pid_t getpid(void);

brief:getpid是获取当前进程的pid

param:调用getpid(),即可显示当前进程的pid

return:返回一个当前进程pid

pid_t getppid(void);

brief:getppid是获取父进程的pid

param:调用getppid(),即可显示父进程的pid

return:返回一个父进程pid

fork创建子进程

pid_t fork(void);

brief:返回两个参数,>0返回的是父进程(返回子进程的pid,把父进程的内容拷贝一份,给子进程)=0返回的是子进程

我们无法知道是父进程先运行,还是子进程先运行,我们得用到wait()函数进行堵塞

return:返回两个参数,>0父进程,=0子进程

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
​
​
void main()
{
​
        pid_t pid;//定义的类型是进程号的类型
​
        pid = fork();
​
        if(pid > 0)
        {
                printf("this is father!\n");
                printf("father pid: %d\n",getppid());
        }
​
        if(pid == 0)
        {
                printf("this is my son!\n");
                printf("son pid:%d\n",getpid());
        }
​
​
}
输出结果:
this is father!
father pid: 2694
this is my son!
son pid:6259

vfor创建子进程

pid_t vfork(void);

brief:创建子进程,但是它会让子进程先执行(直到调用exit结束后,父进程才运行),并且子进程共享内存空间

param:调用vfork(),创建子进程

return:>0返回父进程,=0返回子进程

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
​
void main()
{
​
        pid_t pid;
        int data = 0;
​
        pid = vfork();
​
        if(pid > 0)
        {
                printf("this is father!\n");
                printf("father pid: %d\n",getpid());
        }
​
        if(pid == 0)
        {       while(1)
                {
                        printf("this is my son!\n");
​
                        data++;
                        if(data == 3)
                        {
                                break;
                        }
​
                }
                        printf("son pid:%d\n",getpid());
​
                        exit(0);
​
        }
​
​
}
输出结果:
this is my son!
this is my son!
this is my son!
son pid:7637
this is father!
father pid: 7636

僵尸进程:即子进程先于父进程终止,父进程没有wait子进程,僵尸进程变会占用过多得系统资源

孤儿进程:即父进程先于子进程终止,子进程没有father,就会派init来收留子进程,此时子进程pid = 1,子进程只是被回收了,所以并不会占用系统资源

wait函数

pid_t wait(int *wstatus);

brief:等待子进程结束,回收子进程,可以接收子进程退出状态是正常退出,还是异常退出

param:wstatus,你只想回收子进程,就写NULL,你如果想看子进程退出状态就在定义一个status,传给wstatus,接收子进程退出状态,但此时需要一个宏来解析wstatus,WEXITSTATUS,这个宏来解析子进程退出码,如果你exit(5)退出,那解析出来就=5,=0则是异常退出

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
​
void main()
{
        pid_t pid;
        int status;
​
        pid = fork();
​
        if(pid > 0)
        {
                //wait(NULL);//如果你只是想回收进程,可以直接写NULL
                wait(&status);
                printf("get son status: %d\n",WEXITSTATUS(status));
                printf("this si father!\n");
​
        }
​
        if(pid == 0)
        {
​
                printf("this is my son!\n");
                printf("son pid:%d\n",getpid());
​
                exit(1);
​
        }
​
}
​
输出结果:
this is my son!
son pid:8085
get son status: 1
this si father!

execl/stytem/popen函数

int execl(const char *path, const char arg, / (char *) NULL */)

brief: 在进程或子进程里面替换子进程所拷贝得代码段、数据段、堆栈..从而执行execl里面得命令,但是调用execl,它后面得内容就不会被执行

param:path,执行命令得绝对路径,arg,给这个命令取个名字,后面得arg,则是参数

return:执行成功不返回,执行失败返回-1

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
​
​
void main()
{
        pid_t pid;
​
        pid = fork();
​
        if(pid > 0)
        {
                wait(NULL);
                printf("this is father\n");
        }
​
        if(pid == 0)
        {
                printf("this is my son\n");
​
                execl("/mnt/hgfs/learn/hallo","hallo",NULL);
                printf("Allen iverson");
​
        }
​
​
}
输出结果:
this is my son
This is Li jian hua
this is father

int system(const char *command);

brief:跟execl函数一样,但是它执行完system过后,后面得代码可以继续执行

param:command,即要执行命令的绝对路径

return:执行失败返回127,其他原因返回-1

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
​
​
void main()
{
        pid_t pid;
​
        pid = fork();
​
        if(pid > 0)
        {
                wait(NULL);
                printf("this is father\n");
        }
​
        if(pid == 0)
        {
                printf("this is my son\n");
​
                system("/mnt/hgfs/learn/hallo");
​
                printf("Allen iverson\n");
        }
​
}
输出结果:
this is my son
This is Li jian hua
Allen iverson
this is father

FILE *popen(const char *command, const char *type);

brief:跟execl/system一样,但是它执行完popen可以继续执行其他代码,并且可以把执行的命令给保存下来

param:command,执行命令的绝对路径,type,"w" 把这个文件流从管道输出, "r"把这个文件流流向管道,我们用fread来读取

return:返回一个文件指针

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
​
​
void main()
{
        pid_t pid;
        FILE *  fd;
        char readbuf[1024]= {0};
​
        pid = fork();
​
        if(pid > 0)
        {
                wait(NULL);
                printf("this is father\n");
        }
​
        if(pid == 0)
        {
                printf("this is my son\n");
​
                fd = popen("/mnt/hgfs/learn/hallo","r");//"r",读取
                fread(readbuf,1,1024,fd);
​
                 printf("readbuf = %s\n",readbuf);
​
                exit 
        }
​
​
}
输出结果:
this is my son
readbuf = This is Li jian hua
this is father

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux进程的讲解(僵尸进程、孤儿进程) 的相关文章

  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显

随机推荐

  • ORB_SLAM3复现——上篇

    ORB SLAM3 前言 1 ORB SLAM3 2 准备环境 2 1 C 11 Compiler 2 2 Pangolin 2 3 Opencv 2 4 Eigen 3 复现ORB SLAM3 3 1 下载代码 3 2 执行build s
  • Vector的自动排序Sort

    建立了一个结构体 然后用容器进行存放 想对其进行排序 vector支持sort函数 但是需要自己指定排序函数 方法如下 1 需要包含头文件 include
  • 源码技术分享 计算机毕业设计逆天版Python+Spark智慧城市交通大数据 交通流量预测 交通爬虫 地铁客流量分析 大数据毕业设计 大数据毕设 深度学习 机器学习

    开发技术 前端 vue js websocket echarts element ui 后端 springboot mybaits 大数据组件 Spark 机器学习 深度学习 线性回归预测 KNN CNN等 数据库 mysql Spider
  • 开发人员必学!为什么说Flutter让移动开发变得更好?社招面试心得

    我 程序员 32岁 距离退休 只剩3年了 这句话用来形容2020年互联网行业最适合不过了 从18年开始 大大小小的互联网公司开始了不止一轮的裁员 19年网上开始充斥一类文章 专门写互联网公司超过35岁的人 如果到这个年龄 还不是leader
  • 西门子1200PLC与数控系统808D实现S7通信

    在机床自动化改造时 数控机床和PLC之间进行数据交互 实现数控机床自动控制的功能 需要使用支持的通讯协议或者硬件接线的方式实现 我们知道 西门子系列产品支持西门子S7通讯协议 如何通过西门子S7协议实现西门子1200PLC与数控系统808D
  • vue+iview+select二次封装,搜索,多选等功能封装

    前言 对iview的select下拉进行二次封装 基本上常用的参数和方法里面都有 下拉组件 cselect vue
  • c语言等待几秒执行下一步_C 语言实现协程

    C 语言实现协程 最困难的部分就是上下文信息的保存和还原 这样才能够做到 让协程在任意位置让出执行权限 稍后再恢复到中断位置继续执行 C 实现协程一般有几个方案 使用第三方库来保存恢复上下文数据 比如ucontext 使用汇编来保存上下文信
  • 图像加密笔记之arnold变换及matlab代码实现

    arnold变换 有时候也叫做阿诺德置乱 猫脸变换 Cat Map 因为提出这种算法的数学家拉基米尔 阿诺德最早将其应用于一张猫的图片上 arnold变换是图像加密领域的一个经典置乱算法 所谓置乱 就是打乱图片上各个像素点的位置 以消除原图
  • Eclipse中JavaFX Scene Builder的配置

    一般而言 启动Eclipse windows gt Preferences里面没有JavaFX选项 所以需要配置插件才能使用Scene Builde 一 配置Eclipse的新插件 1 在Eclipse中配置JavaFX 第一部打开Ecli
  • C++ socket通信详解

    Socket是什么 Socket是应用层与TCP IP协议族通信的中间软件抽象层 它是一组接口 在设计模式中 Socket其实就是一个门面模式 它把复杂的TCP IP协议族隐藏在Socket接口后面 对用户来说 一组简单的接口就是全部 让S
  • 解决如何使用layui导入Excel表数据

    解决如何使用layui导入Excel表数据 1 前端页面html代码展示
  • 【python基础知识】4.列表和字典

    文章目录 前言 列表 什么是列表 从列表提取单个元素 从列表提取多个元素 给列表增加 删除元素 数据类型 字典 什么是字典 从字典中提取元素 给字典增加 删除元素 列表和字典的异同 列表和字典的不同点 列表和字典的相同点 前言 截至目前 我
  • nmap 扫描主机端口(谨慎使用)

    安装nmap yum install nmap 输入y安装 使用nmap 语法 nmap 扫描类型 扫描参数 hosts 地址与范围 扫描类型 sT TCP connect 扫描 这是最基本的 TCP 扫描方式 这种扫描很容易被检测到 在目
  • C#根据WORD模板生成WORD文档 C#网页打印

    运行环境 WIN7 X64 iis6 1 开发环境 vs2012 SQL2005 服务器环境 2003 X64 SQL2005 IIS 6 0
  • 语义分割评价指标

    语义分割评估标准 常用的就是 global acc 有的地方叫PA mAcc 有的地方貌似叫MPA mIoU mIoU貌似用的是最最多的 很多论文在展示结果的时候都只个mIoU 下边这张图看不懂不用慌 指标的计算方法 混淆矩阵 1 glob
  • 2023年网络安全比赛--Web渗透测试国赛篇(超详细)

    一 竞赛时间 180分钟 共计3小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1 获取Apache的版本号作为Flag值 例如 5 2 14 提交 2 获取Samba服务器的版本号作为Flag值 例如 5 0 22 提交
  • java基础编程题day27--每日两题

    不用加减乘除做加法 牛客网 目录 不用加减乘除做加法 牛客网 三角形 牛客网 不用加减乘除做加法 牛客网 链接 不用加减乘除做加法 牛客网 来源 牛客网 写一个函数 求两个整数之和 要求在函数体内不得使用 四则运算符号 数据范围 两个数都满
  • 图像识别之表格识别-百度PaddleOCR问题修改版

    百度PaddleOCR表格识别模块 本人根据PaddleOCR release 2 6修改了源码 解决了一些列识别和报错 其具体效果如下 源码地址 https pan baidu com s 1vwmoL7J4LzRlglHyUI1bUw
  • linux 安装linux mysql8.0.15

    a 查看系统中是否以rpm包安装的mysql root localhost opt rpm qa grep i mysql MySQL server 5 6 17 1 el6 i686 MySQL client 5 6 17 1 el6 i
  • Linux进程的讲解(僵尸进程、孤儿进程)

    进程 程序就是你编译过后产生的那个文件 进程就是打开程序过后产生的 fork vfork exit execl system popen 孤儿进程 僵尸进程 wait fork1 getpid getppid区别 pid t getpid