进程间的关系

  1. 进程组

    进程组是一个或多个进程的集合。每个进程除了有一个进程ID之外,还属于一个进程组。每个进程组有一个唯一的进程组ID。每一个进程组都可以有一个组长进程。(一般来说,第一个进程为组长进程)组长进程的标识是,其进程组ID等于其进程的ID。

    只要某个进程中一个进程还存在,则进程组就存在,与其组长进程是否终止无关。

  2. 作业

    Shell分前后台控制的不是进程而是作业或者进程组。在命令行上运行一个二进制程序,则是开启了一个作业。一个前台作业可以由多个进程组成,一个后台作业也可以由很多进程组成。

    作业控制:Shell可以运行一个前台作业和任意多个后台作业

    作业与进程组的区别:如果作业中的某个进程创建了子进程,则子进程不属于作业而是属于一个进                     程组。一旦作业运行结束,Shell就把自己提到前台,若原来的前台进程还存                     在,它自动变为后台进程。

  3. 会话

    会话是一个或多个进程组的集合。一个会话可以有一个控制终端。

    打开一个终端就相当于打开一个会话。

    控制进程:建立与控制终端连接的会话首进程

    一次会话中应该包括:控制进程(会话首进程),一个前台进程组和任意后台进程组

4. 守护进程

守护进程也称为精灵进程。是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的进程。

创建守护进程最关键的一步是调用setsid函数创建一个新的会话。

pid_t setsid(void);

返回值:成功时,返回新创建的会话的id(其实也是当前进程的id)

出错返回-1.

注:在调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1.

成功调用该函数的结果为:

<1> 创建一个新的会话,当前进程称为会话Leader,当前进程的id就是会话的id

<2> 创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id

<3> 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普通的打开文件而不是控制终端。

创建守护进程:

<1> 调用umask将文件模式创建屏蔽字设置为0

<2> 调用fork,父进程退出(exit)。

原因:一般来说,进程组的第一个进程为进程组长,fork出子进程,父进程退出,保证子进程不             是一个进程组的组长进程。

<3> 调用setsid创建一个新会话。setsid会导致(1)调用进程成为新会话的首进程(2)调用进程成       为一个进程组的组长进程(3)调用进程没有控制终端

<4> 将当前工作目录更改为根目录

<5> 关闭不在需要的文件描述符

<6> 忽略SIGCHLD信号

创建守护进程:

int daemon(int nochdir,int noclose)

当 nochdir为零时,当前目录变为根目录,否则不变;

当 noclose为零时,标准输入、标准输出和错误输出重导向为/dev/null,也就是不输出任何信 息,否则照样输出。

返回值:

deamon()调用了fork(),如果fork成功,那么父进程就调用_exit(2)退出,所以看到的错误信息 全部是子进程产生的。如果成功函数返回0,否则返回-1并设置errno。

假如运行成功,父进程在daemon函数运行完毕后自杀,以后的休眠和打印全部是子进程来运行。

在看到有些资料上,创建守护进程时,首先fork子进程,让父进程终止,然后子进程fork出孙子进程,让孙子进程setsid。为什么要fork两次呢?

分析:首先第二次fork也不是必须的。第二次fork的主要目的是:防止进程再次打开一个终端。因为打开一个终端是条件是该进程必须为会话组长,在fork一次,孙子进程id != sid(sid为子进程的sid)。所以无法打开新的控制终端。

时间: 2024-10-08 16:47:01

进程间的关系的相关文章

Linux命令之pstree - 以树状图显示进程间的关系

本文链接:http://codingstandards.iteye.com/blog/842156   (转载请注明出处) 用途说明 pstree命令以树状图显示进程间的关系(display a tree of processes).ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰.在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程. 常用参

[Linux] Linux命令之pstree - 以树状图显示进程间的关系

转载自: http://codingstandards.iteye.com/blog/842156 pstree命令以树状图显示进程间的关系(display a tree of processes).ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰.在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程. 常用参数 格式:pstree 以树状图显

运行中nginx进程间的关系

在正式提供产品的环境下,部署nginx都是使用master进程来管理多个worker进程. 一般情况下,worker进程都与服务器上的核数相等,每一个worker进程都是繁忙的,它们真正的提供互联网服务. 而master进程则很清闲,只负责监控管理worker进程. worker进程之间通过共享内存,原子操作等一系列进程之间的通讯来实现负载均衡 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是

进程间的调试关系

[进程间的调试关系] 建立调试器和调试目标的关系,可以通过CreatePorcess和DebugActiveProcess两个函数来完成. DebugActiveProcess()用于绑定到已运行进程.OllyDbg的附加功能就是通过此函数完成. 解决调试关系可以用如下函数: [判断进程是否处于被调试状态] 1.IsDebuggerPresent() [调试循环] 1.等待调试消息. 2.恢复调试断点. [其它] 1.异常断点函数 进程间的调试关系,码迷,mamicode.com

进程间关系

POSIX规定一个进程内部的多个thread要共享一个PID, 但是,在linux kernel中不论是进程还是线程,都是会分配一个task struct并且分配一个唯一的PID(这时候PID其实就是thread ID). 这样,为了满足POSIX的线程规定,linux引入了线程组的概念,一个进程中的所有线程所共享的那个PID被称为线程组ID,也就是task struct中的tgid成员. 因此,在linux kernel中,线程组ID(tgid,thread group id)就是传统意义的进

(转)进程间关系:进程、僵尸进程、孤儿进程、进程组、前台进程组、后台进程组、孤儿进程组、会话、控制终端

不同的shell对使用管道线时创建子进程的顺序不同,本文以bash为例,它是支持作业控制的shell的典型代表. 僵尸进程与孤儿进程 僵尸进程:先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程.孤儿进程:该进程的父进程先于自身终止.其特点是PPID=1(init进程的ID).一个孤儿进程可以自成孤儿进程组. 文中用到的缩写 PID = 进程ID (由内核根据延迟重用算法生成)PPID = 父进程ID(只能由内核修改

[转] linux系统文件流、文件描述符与进程间关系详解

http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括: 1.linux多/单进程与多/单文件对于文件流和描述符在使用时的关联情况及一些需要注意的问题. 2.fork,vfork流缓冲等对文件操作的影响. 1.linux文件系统结构 首先补充一点基础知识,了解一下linux文件系统.如下图所示: 图1 磁盘,分区和文件系统 应该明白,上图所示结构是硬盘中文件存放

进程和线程的关系及区别,进程间如何通讯,线程间如何通讯

1 定义 进程:进程是程序处理机上的一次执行过程, 它是一个动态的概念,它是系统进行资源分配和调度的一个独立单位. 线程:进程的一个实体,是CPU运行调度的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2 关系 一个线程可以创建和撤销另一个线程:同一个进程中的多个线程之间可以并发执行: 相对进程而言,线程是一个更加接近于执行体的概念,它可

进程间的通信方式

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信.# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段.# 消息队列( m