"I ask you, have you ever known what it is to be an orphan?"

"I ask you, have you ever known what it is to be an orphan?"

/*

* Determine if a process group is "orphaned", according to the POSIX

* definition in 2.2.2.52.  Orphaned process groups are not to be affected

* by terminal-generated stop signals.  Newly orphaned process groups are

* to receive a SIGHUP and a SIGCONT.

*

* "I ask you, have you ever known what it is to be an orphan?"

*/

linus 很不质疑的问看代码的人,“爷问你, 你知道啥是orphaned group 吗?!”

int is_orphaned_pgrp(int pgrp)
{
    struct task_struct **p;

    for (p = &LAST_TASK ; p > &FIRST_TASK ; --p) {
        if (!(*p) ||
            ((*p)->pgrp != pgrp) ||
            ((*p)->state == TASK_ZOMBIE) ||
            ((*p)->p_pptr->pid == 1))
            continue;
        if (((*p)->p_pptr->pgrp != pgrp) &&
            ((*p)->p_pptr->session == (*p)->session))
            return 0;
    }
    return(1);    /* (sighing) "Often!" */
}

Orphaned Process Groups

When a controlling process terminates, its terminal becomes free and a new session can be established on it. (In fact, another user could login on the terminal.) This could cause a problem if any processes from the old
session are still trying to use that terminal.

To prevent problems, process groups that continue running even after the session leader has terminated are marked as
orphaned processgroups.

When a process group becomes an orphan, its processes are sent a SIGHUP signal. Ordinarily, this causes the processes toterminate. However, if a program ignores this signal or establishes ahandler for it
, it can continue running as inthe orphan process group even after its controlling process terminates;but it still cannot access the terminal any more.

这个是GNU给出的解释

http://www.gnu.org/software/libc/manual/html_node/Orphaned-Process-Groups.html

我简单的注释了一下。。。。估计还是很抽象

int is_orphaned_pgrp(int pgrp) //判断是否为一个孤儿进程组
{
    struct task_struct **p;

    for (p = &LAST_TASK ; p > &FIRST_TASK ; --p) {
        if (!(*p) || //如果进程不存在,下一个
            ((*p)->pgrp != pgrp) ||  // 如果进程所处的进程组不是pgrp,下一个
            ((*p)->state == TASK_ZOMBIE) || // 进程的状态是zombie,下一个
            ((*p)->p_pptr->pid == 1)) //进程parent是init ,下一个
            continue;
        if (((*p)->p_pptr->pgrp != pgrp) && //如果父进程所在的组不在pgrp,但是父进程所在的session存在
            ((*p)->p_pptr->session == (*p)->session))
            return 0;
    }
    return(1);    /* (sighing) "Often!" */
}

有图有真相

orphan 与否是靠 parent 和child 的关系来维护,鉴别的

假设判断group2 是否是一个 orphaned group

搜索所有在grp2 里面的进程,只要这个grp2里面的任意进程的parent 进程在当前session,且不在当前process group,那么说明这个group和外界还有联系,他就不是orphan group,只有没有联系了,grp2所有的进程的parent 进程都不在group 2之外,这时候,group内的进程没有能通过parent child关系来和外界发生联系,It‘s a orphan group!

"I ask you, have you ever known what it is to be an orphan?",布布扣,bubuko.com

时间: 2024-12-06 01:28:33

"I ask you, have you ever known what it is to be an orphan?"的相关文章

使用GitHub建立个人网站

使用GitHub建立个人网站 1 Git简介 2 为什么使用Github Pages 3 创建Github Pages 3.1 安装git工具. 3.2 两种pages模式 3.3 创建步骤 3.4 常用命令 4 使用Jekyll搭建博客 4.1 什么是jekyll 4.2 jekyll本地环境搭建 4.3 jekyll目录结构 4.4 Jekyll-Bootstrap创建博客 4.5 Jekyll 写博过程 4.6 个性化博客 5 使用Markdown 5.1 简介 5.2 基本语法 5.3

根据76大细分词性对单词进行归组(二)

词性的重要性不言而喻,尤其是对于自然语言处理来说,哪怕就是记单词,根据词性对单词进行归组也是非常有帮助的. superword是一个Java实现的英文单词分析软件,主要研究英语单词音近形似转化规律.前缀后缀规律.词之间的相似性规律等等. 各大词性及其包括的词: 32.N-COUNT-COLL(可数集合名词) (词数:50) 1 aristocracy army array audience band 2 cast chapter command commission committee 3 co

Linux运维学习笔记之二:常用命令2

71.passwd:修改用户密码 语法 passwd [参数]username 选项 -k  --keep-tokens :保留即将过期的用户在期满后仍能使用 -l  --lock :锁定用户无权更改其密码,只能root才能操作 -u --unlock :解除锁定 -S --status :查看用户状态 -d --delete :删除用户密码,只能root才能操作 -f --force :强制操作,只能root才能操作 -n mindays :修改密码的最小天数,也就是mindays天内不能再次

第五课 进程管理

unix_c_05.txt================第五课 进程管理================一.基本概念------------1. 进程与程序~~~~~~~~~~~~~1) 进程就是运行中的程序.一个运行着的程序,可能有多个进程.进程在操作系统中执行特定的任务.2) 程序是存储在磁盘上,包含可执行机器指令和数据的静态实体.进程或者任务是处于活动状态的计算机程序.2. 进程的分类~~~~~~~~~~~~~1) 进程一般分为交互进程.批处理进程和守护进程三类.2) 守护进程总是活跃的

ubifs概述

UBIFS无排序区块图像文件系统(Unsorted Block Image File System, UBIFS)是用于固态存储设备上,并与LogFS相互竞争,作为JFFS2的后继文件系统之一.真正开始开发于2007年,并于2008年10月第一次加入稳定版本于Linux核心2.6.27版. 由IBM.nokia工程师Thomas Gleixner.Artem Bityutskiy等人于2006年发起,致力于开发性能卓越.扩展性高的FLASH专用文件系统,以解决嵌入式环境下以FLASH作为MTD设

ubifs物理存储

Ubifs通过ubi管理MTD设备,ubi的LEB随机映射PEB,其本身占用一部分PEB,具体文件存储情况分析如下. 1. Ubi中不管是是逻辑块号还是物理块号都是从0开始的.一般情况下,Nandflash开始处存放bootloader和linux,这样LEB与PEB间存在一个偏移,此偏移由ubifs起始位置确定. 2. Ubi管理整个flash(属于ubi部分的flash),ubi分区在ubi flash区域之上分配.从MTD层看,整个ubi属于同一mtd分区. 3. 在ubi中,每个PEB第

Git的奇技

Git是一个“分布式版本管理工具”,简单的理解版本管理工具:大家在写东西的时候都用过“回撤”这个功能,但是回撤只能回撤几步,假如想要找回我三天之前的修改,光用“回撤”是找不回来的.而“版本管理工具”能记录每次的修改,只要提交到版本仓库,你就可以找到之前任何时刻的状态(文本状态). 下面的内容就是列举了常用的git命令和一些小技巧,可以通过"页面内查找"的方式进行快速查询:Ctrl/Command+f. 开卷必读 如果之前未使用过Git,可以学习廖老师的免费Git教程入门 一定要先测试命

孤儿进程 && 僵尸进程

background: unix: 每个子进程退出,内核释放该进程所有资源,打开的文件,占用的内存 保留的信息:the process ID,the termination status of the process,the amount of CPU time taken by the process 父进程用wait()/waitpid()释放子进程的保留信息 父进程不调用wait()/waitpid()进程号一直被占用,系统所能提供的进程号有限,没有可用的进程号导致系统不能产生新的进程 Z

【RMAN】利用备份片还原数据库(中)

[RMAN]利用备份片还原数据库 [RMAN]利用备份片还原数据库(上): http://blog.itpub.net/26736162/viewspace-1621581/ 在上一篇blog中我们介绍了采用dbms_backup_restore来找回控制文件并恢复整个数据库的方法,本篇blog我们介绍采用创建临时库来找回控制文件的方法. 1.1.1  方法二:尝试采用创建临时库来找回控制文件 由于RMAN必须工作在MOUNT模式,所有的数据文件都丢失,无法通过只重建控制文件将其启动到MOUNT

孤儿进程和僵尸进程

孤儿进程和僵尸进程 一.定义:什么是孤儿进程和僵尸进程 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出.这个子进程就是僵尸进程. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程将会导致资源浪费,而孤儿则不会. 子进程持续10秒钟的僵尸状态(EXIT_ZOMBIE)------------------------------