进程间的关系

     进程间有什么关系呢?我们都知道使用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):给一个停止的进程发送这个信号后,这个信号并不会立即处理,而要等进程准备运行之前处理,其默认处理动作是结束进程。

猜你喜欢

转载自blog.csdn.net/guaiguaihenguai/article/details/79966648