进程间的关系

标签: 进程组 作业 会话 PS命令 grep命令
18人阅读 评论(0) 收藏 举报
分类:
    进程间有什么关系呢?我们都知道使用fork函数创建进程是一次调用两次返回。父进程返回子进程的进程ID(非0),子进程返回0值。很显然,使用fork创建出来的两个进程是父子关系。那如果两个进程都是同一个父进程创建出来的,它们是什么关系呢?“兄弟”关系。那么,两个或者多个进程之间,都有什么关系呢?

在介绍进程间关系之前先介绍两个重要的概念前台进程与后台进程
       我们输入的命令由bash帮我们执行相应的程序,但是当我们使用./命令将自己的写的可执行程序执行起来,在程序运行结束之前,我们输入命令都没有反应,这是为什么呢?因为shell可以运行一个前台(进程)和任意多个后台(进程)。我将进程两个字用括号括起来了,因为这么说还不是很准确,等会再做更正。前台正在运行我们自己的程序,那么bash就只能被提到后台去了。而只有前台进程才可以收到来自控制端的数据,此时处于后台的bash是接收不到我们输入的命令的。
       我们执行一个程序,会默认把它放到前台,有时候我们希望将一个进程放到后台去执行,只需要在执行程序后边再加一个 & 就可以将一个程序放到后台去执行了。如果想要将后台进程提到前台,使用命令fg n n是该后台进程的编号,可以通过命令 jobs 查看当前后台正在运行的进程。

除了将后台进程提到前台,还可以使用命令 bg 将前台进程提到后台,

进程组
       一个或多个进程可以构成一个进程集合,叫做进程组。通常,它们与同一个作业相关联,可以接受来自同一终端的各种信号。每个进程除了有一个进程ID之外,还属于一个进程组。每个进程组都有一个唯一的进程组ID。且每个进程组都有一个组长进程,组长进程的ID就是进程组的ID。通常,一个进程组的组长进程就是创建的第一个进程。或者可以这么说,创建一个进程,就创建了一个进程组,只是现在这一个进程组里边现在只有一个进程(组长进程)。组长进程还可以创建改组中的其他进程。
       一个进程组,只要有任意一个进程存在,该组就是存在的,与组长是否存在无关。

作业
首先来看一个简单的例子

在这个例子里边我们通过管道同时执行两个程序,一个hello,一个sleep。很显然,这两个进程是属于一个进程组。我们将多个进程同时开启,认为是为了让这多个进程一起完成某项任务,将这样的多个进程组叫做作业。再回到例子中,当输入Ctrl+C回车发现两个进程都被终止了。说明两个进程都收到了Ctrl+C,那么,这两个进程都应该是前台进程,而前边说shell只允许一个前台进程,在这里就推翻了,这是不准确的,应该说是:shell可以运行一个前台作业(或进程组)和任意多个后台作业(或进程组)这称为作业控制。
进程组和作业的区别:如果作业中的某个进程有创建了一个子进程,可是子进程不属于作业,但是属于进程组
说明:在前台新起一个作业,shell被提到后台,当前台作业退出了,shell就自动被提到前台来继续运行。如果,我们在新起的作业中创建一个子进程,然后父进程退出,那么,子进程会被自动提到后台去运行。
看这样一个例子:
#include <stdio.h>
#include <unistd.h>
int main()
{
    pid_t pid = fork();
    if(pid < 0)
        perror("fork");
    if(pid == 0)//child
    {
        while(1)
        {
            printf("I'm child,pid is:%d\n",getpid());
            sleep(1);
        }
    }
    else//father
    {
        int count = 5;
        while(count--)
        {
            printf("##I'm father,pid is:%d##\n",getpid());
            sleep(1);
        }
    }
    return 0;
}

会话
会话(Session)是一个或多个进程组的集合。一个会话可以有一个控制终端。这通常是登录到其上的终端设备(终端登录的情况下)或伪终端设备(网络登录的情况下)。 
建立与控制终端连接的会话首进程称为控制进程。一个会话中的几个进程组可被分为一个前台进程组和任意多个后台进程组。所以一个会话中应包含一个控制进程(会话首进程)、一个前台进程组合任意多个后台进程。
新起两个作业

SID是指会话ID。
如上这里-bash为控制进程,同时也是前台作业,两条执行三个sleep进程的命令分别创建了一个后台作业。这样bash进程和两个后台构成了一个会话。

PS:-bash和bash的区别是:-bash是在网络中登录的。因为这里是通过Xshell连接到虚拟机上的,所以是-bash

命令 ps axj | grep myprocess |grep -v grep myprocess是当前正在执行的程序的名字。     
ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。
ps命令的选项:
        a:不仅列出当前用户的进程,也列出所有其他用户的进程
        x:表示不仅列出当前终端的进程,也列出所有无控制终端的进程
        j:表示列出与作业相关的信息

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
作业控制有关信号: 
jobs:可查看当前有哪些作业。 
选项: 
-l:显示进程号; 
-p:仅任务对应的显示进程号; 
-n:显示任务状态的变化; 
-r:仅输出运行状态(running)的任务; 
-s:仅输出停止状态(stoped)的任务。

fg:将指定(如果后台作业只有一个不用指定)作业提至前台运行,如果作业处于停止状态,则给这个作业的每个进程发送SIGCONT信号使之运行。
bg:用于将指定作业放到后台运行,其运行效果与在指令后面加&一样。如果指定作业处于停止状态,则向作业中每个进程发送SIGCONT信号使之运行。
Ctrl+Z:向前台作业进程发送SIGTSTP信号,不会终止前台进程,而是让前台进程提到后台进程,且将其状态设置为stop。
Ctr+C:给前台作业中的每个进程发送SIGINT信号,结束前台作业。对后台作业无效。
SIGTERM(15):给一个停止的进程发送这个信号后,这个信号并不会立即处理,而要等进程准备运行之前处理,其默认处理动作是结束进程。
查看评论

进程间的关系

转自:http://blog.csdn.net/llzk_/article/details/58129094 概念 守护进程也称精灵进程,是运行在后台的一种特殊进程。守护进程独立于...
  • qq_26525317
  • qq_26525317
  • 2017年06月10日 21:54
  • 83

进程间同步和互斥

概念: 两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与时间有关的错误,这种现象被称作进程互斥· 也就是说,一个进程正在访问临界资源,另一个要访问该资源的进程必须等...
  • lishuandao
  • lishuandao
  • 2016年03月20日 18:37
  • 936

进程间通信和线程间同步区别

进程间通信和线程间同步区别
  • zhang_yin_liang
  • zhang_yin_liang
  • 2017年04月23日 20:24
  • 476

进程间互斥与同步

进程间互斥与同步实验题目:进程间的互斥与同步 实验内容:编写算法,实现进程间对临界资源的互斥访问以及进程间的同步关系 实验要求: 1、要求进程互斥使用文本文件; 2、假定文本文件txt...
  • scylhy
  • scylhy
  • 2017年05月15日 22:18
  • 863

浅谈进程间的消息传递

    随着我们开发的应用的日益复杂,像以往那样将所有功能坐在一个exe文件中情况越来越少,更多时候是整个应用由若干模块、甚至若干单独的exe文件组成,这就涉及到了模块或进程间的通讯交互问题,本文主要...
  • Handsomewang527
  • Handsomewang527
  • 2007年07月03日 07:55
  • 2570

初学者浅谈“进程间通信的同步和互斥的比较简单的作用和用法”

第一次发blog,若有错误请谅解和指导,谢谢!!!! 好了,我们回归正题: 随着时代的发展,线程应运而生。这是为什么呢?这是因为我们要进一步减少CPU的空转时间,支持多处理器以及减少上下文切换的开销,...
  • hbz1993
  • hbz1993
  • 2014年11月26日 19:26
  • 799

进程间线程间的同步锁原理和种类

同步锁的基本概念: 锁基本都是内核对象,用于控制多线程间多进程间的同步访问。 我们知道进程间的同步操作都是要借助内核来完成的,和同一个进程中的线程同步只需要在用户模式下是有很大差别的,当然,对于进程安...
  • Blues1021
  • Blues1021
  • 2015年03月16日 23:47
  • 4648

进程间通信 和 线程间同步

以前经常搞混,所以记录下来。 进程间通信主要是指多个进程间的数据交互。 而进程/线程间同步主要指维护多个进程/线程之间数据准确、一致性。 一.进程间通信主要有以下几种方式: 管道(pipe):...
  • majianfei1023
  • majianfei1023
  • 2016年05月31日 23:47
  • 1672

进程间通信学习笔记-互斥锁 && 读写锁

第七章 互斥锁和条件变量 互斥锁是用于保护临界区的,实际上是保护在临界区中被操纵的数据,保护多个线程或者多个进程的共享数据。 #include int pthread_mutex_lock(p...
  • yuanlairuci1992
  • yuanlairuci1992
  • 2016年08月07日 08:47
  • 562

最简单的进程间发消息通知

在做短信拦截后,发现特定的消息,可以通过这个来启动指定的软件,或者向指定的程序运行实例的窗口上发消息,通知短信的内容!SendMessage进程间简单通信问题 vc++本例以两个VC Dialog a...
  • simalaya
  • simalaya
  • 2008年05月27日 10:07
  • 991
    个人资料
    持之以恒
    等级:
    访问量: 9823
    积分: 632
    排名: 7万+
    最新评论