shell-linux会话结束时进程关系变化

问题描述

linux会话结束时进程关系变化

一个会话里有多个进程组运行着,当会话首进程(可能是login shell)
终止(可能是被kill或shell退出引起),那么此时该会话里的进程会怎样,会收到
哪些信号,是否全程成为孤进程组?

解决方案

好像没有什么情况发生。

_> cat a.c
#include
#include

void stat(void)
{
printf("pid=%d, pgid=%d, sid=%dn", getpid(), getpgid(0), getsid(0));
}

int main()
{
fork();
stat();
setpgid(0, 0);
stat();
pause();
}

setsid a
pid=17060, pgid=17060, sid=17060
pid=17060, pgid=17060, sid=17060
pid=17061, pgid=17060, sid=17060
pid=17061, pgid=17061, sid=17060

ps -j f
PID PGID SID TTY STAT TIME COMMAND
17060 17060 17060 ? Ss 0:00 ./a
17061 17061 17060 ? S 0:00 _ ./a

kill 17060

ps -j f
PID PGID SID TTY STAT TIME COMMAND
17061 17061 17060 ? S 0:00 ./a_

解决方案二:

不好意思,说错了,应该是会成为orphan process group。如果已经处于STOP状态,会收到HUP+CONT信号。

#include
#include
#include

void sig(int nr)
{
printf("%d: got %dn", getpid(), nr);
}

void show(void)
{
printf("pid=%d, ppid=%d, pgid=%d, sid=%dn", getpid(), getppid(), getpgid(0), getsid(0));
}

int main()
{
signal(SIGHUP, sig);
fork();
show();
setpgid(0, 0);
show();
kill(getpid(), SIGTSTP);
perror("kill");
show();
}

setsid a
pid=19464, ppid=1, pgid=19464, sid=19464
pid=19464, ppid=1, pgid=19464, sid=19464
pid=19465, ppid=19464, pgid=19464, sid=19464
pid=19465, ppid=19464, pgid=19465, sid=19464
kill: Operation not permitted
pid=19464, ppid=1, pgid=19464, sid=19464
19465: got 1 <------------------- here
kill: Success
pid=19465, ppid=1, pgid=19465, sid=19464

时间: 2024-11-27 06:38:41

shell-linux会话结束时进程关系变化的相关文章

linux会话浅析

说起会话,我们经常登录到linux系统,执行各种各样的程序,这都牵涉到会话.但是,一般情况下我们又很少会去关注到会话的存在,很少会去了解它的来龙去脉.本文就对linux会话相关的信息做一些整理,看看隐藏在我们日常使用的背后,都有些什么样的逻辑. [会话的维系] 维系一个会话,最常见的有两种方式: 一是基于某种凭证,比如web网站的登录会话,在登录验证之后,服务器就会返回一个session id作为凭证.用户之后的请求总是会带上这个id,而服务器通过这个id也就能知道用户是谁.直到用户注销登录.或

Linux进程关系

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux的进程相互之间有一定的关系.比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构.我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程.   进程组 (process group) 每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程.进程组会有一个进程组领导进程 (pro

Linux进程管理之结束与进程名称相匹配的进程(sh脚本)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1554623 在Linux系统中经常会遇到结束某个进程的情况,一般我们会使用kill.pkill.killall甚至top这样的工具结束进程,但这些工具虽然是结束进程的基本工具,但使用起来要接进程名全名或准确的pid.下文提供的脚本可以结束与指定的进程名称相匹配的任意进程(杀死指定名称的进程),如果匹配的pid有两个

linux 如何结束进程

首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: # kill -pid 注释:标准的kill命令通常都能达到目的.终止有问题的进程,并把进程的资源释放给系统.然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源.为了防止这些所谓的"僵尸进程",应确保在杀死父进程之前,先杀死其所有的子进程. *确定要杀死进程的PID或PPID # ps -ef | grep httpd 结束进程 # kill -l PID -l选项告诉kill命令用好像启动进程的

Linux内核剖析 之 进程简介

1.概念    1.1  什么是进程?     进程是程序执行的一个实例,可以看作充分描述程序已经执行到何种程度的数据结构的汇集.     从内核观点看,进程的目的就是担当分配系统资源(CPU时间,内存等)的实体.     我们熟悉的fork()库函数,它有两种用法:     (1).一个父进程希望复制自己,使父子进程执行不同的代码段,常用于网络服务程序.     (2).一个进程要执行一个不同的程序,fork()后立即exec(),如shell. 1.2  什么是线程?     有时候,一个进

Linux中线程和进程的区别

Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格.内存空间.磁盘空间.I/O设备等,然后该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其他相关资源,该进程就被运行起来. 线程是进程的一个实体,是CPU调度和分配的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器.一组寄存器和栈),但

总结Linux中用于终结进程的kill和pikill及killall命令用法

  kill kill 命令:发送指定的信号到相应进程.不指定信号将发送SIGTERM(15)终止指定进程.若仍无法终止该程序可用"-KILL" 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号.root用户将影响用户的进程,非root用户只能影响自己的进程 -l <信号变化哦啊>,若不加信号的编号参数,则使用"-l"参数会列出全部的信号名称 -a 当处理当前进程时,不限制命令名和进程号的对应关系

深入解析Linux系统下的进程切换

  Linux内核下进程切换 Linux切换并没有使用X86CPU的切换方法,Linux切换的实质就是cr3切换(内存空间切换,在switch_mm函数中)+ 寄存器切换(包括EIP,ESP等,均在switch_to函数中).这里我们讲述下switch_to主流程: 1. 在switch_mm函数中将new_task->pgd设置到cr3寄存器中,实现页表切换,由于每个进程3-4G的页表映射机制完全一样(从内核页表中直接复制过来的),故这里虽然切换了pgd,但是并无影响,只是在任务回到用户空 间

linux下的守护进程_Linux

Linux下的常驻进程的作用不可忽略,但这里面的问题也不能忽略,怎么启动进程,怎么结束进程,怎么在进程挂掉之后重启进程都要设计的合理.下面看一个shell控制的php常驻进程的例子. 不废话,直接捞干货,上代码,通过代码来讲解更容易理解: 复制代码 代码如下: #!/bin/sh #filename test.sh #绝对定位该文件的位置,不随执行目录而变化 cd $(cd "$(dirname "$0")";pwd) readonly path=$(pwd)/ f