Linux应用编程

2023-11-01

孤儿进程

在Linux/Unix环境中,我们是通过fork函数来创建子进程的。创建完毕之后,父子进程独立运行,父进程无法预知子进程什么时候结束。通常情况下,子进程退出后,父进程会使用wait或waitpid函数进行回收子进程的资源,并获得子进程的终止状态。

但是,如果父进程先于子进程结束,则子进程成为孤儿进程。孤儿进程将被init进程(进程号为1)领养,并由init进程对孤儿进程完成状态收集工作。

因此,孤儿进程是没有父进程的进程,它在完成自己的工作退出之后,init进程将完成孤儿进程的善后工作,回收它的资源,因此孤儿进程并不会有什么危害。

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

int main(void)
{
    pid_t pid;
    pid = fork();
    if (pid == 0) {
        while (1) {
			/* 子进程死循环,保证不死 */
            printf("I am child, my parent pid = %d\n", getppid());
            sleep(1);
        }
    } else if (pid > 0) {
			/* 父进程睡眠3秒后退出 */
            printf("I am parent, my pid is = %d\n", getpid());
            sleep(3);
            printf("------------parent going to die------------\n");
    } else {
        perror("fork");
        return 1;
    }
    return 0;
}

 

 

僵尸进程

而如果子进程先于父进程退出,同时父进程太忙了,无瑕回收子进程的资源,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。 

内核对于进程的退出有一套固定的机制,就是会释放该进程所有的资源,包括打开的文件,占用的内存等。但仍然有一部分信息残留在内核中,比如:进程号,退出状态,运行时间等。一般来说,父进程会调用wait或waitpid来获取子进程的退出状态,子进程的资源也随之释放。但如果父进程陷入死循环或没有调用wait/waitpid函数的话,那么子进程残留的信息将得不到释放,会一直占用内核资源。而内核的资源一般是非常宝贵的,因此如果产生大量的僵尸进程的话,将严重影响系统的性能,应避免僵尸进程的产生。

杀死僵尸进程的方法:

如其名,僵尸进程其实已经就是退出的进程,因此无法再利用kill命令杀死僵尸进程。僵尸进程的罪魁祸首是父进程没有回收它的资源,那我们可以想办法它其它进程去回收僵尸进程的资源,这个进程就是init进程。因此,我们可以直接杀死父进程,init进程就会很善良地把那些僵尸进程领养过来,并合理的回收它们的资源,那些僵尸进程就得到了妥善的处理了。

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

int main(void)
{
    pid_t pid;
    pid = fork();
    if (pid == 0) {
            printf("I am child, my parent= %d, going to sleep 3s\n", getppid());
            sleep(3);
            printf("-------------child die--------------\n");
    } else if (pid > 0) {
            printf("I am parent, pid = %d, myson = %d, going to sleep 5s\n", getpid(), pid);
            sleep(5);
			system("ps -o pid,ppid,state,tty,command");
    } else {
        perror("fork");
        return 1;
    }

    return 0;
}

 

 

---------------

码字不易,点个赞再走呗~

我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注我的公众号「良许Linux」,回复「1024」获取最新最全的技术资料,回复「入群」进入高手如云技术交流群;提供永久免费 CSDN 资料下载服务。

 

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

Linux应用编程 的相关文章

  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • 海思3559A上编译FFmpeg源码操作步骤

    1 从https github com FFmpeg FFmpeg releases 下载你需要的版本 2 因为ffmpeg编译选项较多 为了更方便的了解有哪些选项 可将编译选项写入到一个文本文件configure help txt中 执行
  • 在 Python 中逐行打印字典的项目

    Python 中逐行打印字典的项目 使用 dict items 方法获取字典项目的视图 使用 for 循环遍历视图 使用 print 函数逐行打印字典的项目 my dict id 1 name jiyik age 30 for key va
  • hive 压缩编码

    文章目录 1 hadoop 压缩编码 1 1 MR支持的压缩编码 2 编码 解码器 3 压缩性能的比较 4 压缩配置参数 2 hive压缩编码 2 1 如何查看hive支持的压缩 2 1 hive编码的选择 2 2 配置 1 hadoop
  • 解决问题Caused by: java.net.UnknownHostException

    在Java中 java net UnknownHostException 异常表示无法解析主机名 这意味着你尝试连接的主机名无法解析为 IP 地址 可能的原因有 主机名错误 请确保输入的主机名正确 网络连接问题 请检查网络是否连接正常 DN
  • Maven的安装以及环境的配置

    一 准备工作 1 确定电脑上已经成功安装jdk7 0以上版本 2 win10操作系统 win7操作系统 3 maven安装包 下载地址 http maven apache org download cgi 二 解压Maven安装包 在上述地
  • Django连接数据库出错

    pymysql可能出现的版本不匹配问题 第一个问题 File D virtualenv wx lib site packages django db backends mysql base py line 36 in
  • 最新Tesseract-OCR源码编译1——leptonica编译

    上次写了Tesseract OCR 3 02命令行程序的简单使用 同时官网上给出了3 02版本基于VS2008平台的编译工程 但对于最新源码只是说了在VS2015 3 05 和VS2013 3 04 的编译 还是英文的 且网上关于最新源码的
  • iOS各版本发布时间和特点

    iOS各版本发布时间和特点 iOS9 发布时间2015年6月9日 特性 更新于开发的内容 1 iOS9系统发送的网络请求将统一使用HTTPs 将不再默认使用HTTP等不安全的网络协议 而默认采用TLS 1 2 服务器因此需要更新 以解析相关
  • errno 104:connetction reset by peer的错误分析

    https blog csdn net alibo2008 article details 45694845 errno 104错误表明你在对一个对端socket已经关闭的的连接调用write或send方法 在这种情况下 调用write或s
  • Meta为全天候AR眼镜设计了AI系统的八大指导方针

    众所周知 Meta不仅局限在Quest这类VR头显上 同时还在打造更轻量化的AR眼镜 目标就是让产品更好的融入到人们的日常生活中去 除了硬件上轻量化以外 在功能和交互体验上也至关重要 例如自然交互方式 比如手势输入 以及AI视觉助手等 这其
  • Ros中可视化工具rqt 命令

    rqt工具箱可视为ROS数据的界面调试工具 rosrun rqt 按tab键 可以查看所有的rqt工具 以下介绍为常用的命令 目录 1 rqt tf tree 2 rqt graph 3 rqt plot 4 rqt topic 1 rqt
  • vue-cli 方式创建 uni-app 项目(支持快捷键)

    文章目录 1 前言 2 创建 uni app 3 删除多余依赖 4 支持快捷键 5 安装 uni ui 及 sass 6 配置 easycom 7 运行 1 前言 由于习惯了 VSCode 的使用 本着快速交付 不需要转换开发思维 不需要更
  • 跟ChatGPT同源插件,专为测试人的开放,快来看看吧

    3 月 23 日 OpenAI 又投出了一枚重磅炸弹 为 ChatGPT 推出插件系统 此举意味着 ChatGPT 将迎来 APP Store 时刻 也就是围绕它的能力 形成一个开发者生态 打造出基于 AI 的 操作系统 插件系统将为 Ch
  • [知识图谱实战篇] 八.HTML+D3绘制时间轴线及显示实体

    前面作者讲解了很多知识图谱原理知识 包括知识图谱相关技术 Neo4j绘制关系图谱等 但仍缺少一个系统全面的实例 为了加深自己对知识图谱构建的认识 为后续创建贵州旅游知识图谱打下基础 作者深入学习了张宏伦老师的网易云课程 星球系列电影 并结合
  • Linux系统版本信息查看

    一 查看Linux内核版本命令 方法1 cat proc version root localhost cat proc version Linux version 3 10 0 957 el7 x86 64 mockbuild kbuil
  • 型号不同的计算机内存条可以通用么,笔记本内存条和台式机通用吗

    电脑分为笔记本和台式机 这两者里面都有一个很重要的部件就是内存条 虽然作用都是相同的 但两者却是不一样的 那么笔记本内存条和台式机通用吗 答案是不可以 下面小编会给大家详细介绍不能通用的原因 以及笔记本内存条怎么装 看型号等等问题 笔记本内
  • 【Chisel入门——数据类型与操作符号】

    文章目录 前言 Chisel开发环境部署 安装步骤 环境测试 实验环境问题说明 数据类型 UInt SInt Bool Vec T Bundle 操作符 总结 前言 前面的部分简单介绍了Chisel 新型敏捷硬件开发语言 也简单说明了开发环
  • 黑马并发编程JUC(信号量、线程安全类)总结

    黑马并发编程JUC总结 9 JUC Semaphore 定义 原理 acquire release CountDownLatch 为什么需要用到CountDownLatch 定义 为什么加载的时候需要使用到countDownLock 商品问
  • EsayExcle的简单使用

  • Linux应用编程

    孤儿进程 在Linux Unix环境中 我们是通过fork函数来创建子进程的 创建完毕之后 父子进程独立运行 父进程无法预知子进程什么时候结束 通常情况下 子进程退出后 父进程会使用wait或waitpid函数进行回收子进程的资源 并获得子