【Linux】进程间关系和守护进程

一、进程组

  • 是一个或多个进程的集合,进程组的ID等于组长进程ID

  • 进程组不会随着进程组长的退出而退出,只要有一个进程存在,则该进程组就存在

  • sleep 100 | sleep 200 | sleep 300 &     他们属于兄弟进程,&表示将进程放在后台运行

  • ps axj | head -n 1

    • a:列出当前用户及所有其他进程

    • x:列出有控制终端及无控制终端的进程

    • j:列出与作业控制相关的信息

杀死了进程组长,但进程组依然存在

二、作业

多个进程组成,一个后台作业也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业---->作业控制

但子进程不属于作业),一旦前台运行的作业结束,shell就把自己提到前台。因此在执行程序的时候,无法在Shell中输入命令,一旦程序运行结束shell又被提到前台,用户可以继续输入命令。

  • 概念

    • Shell分前后台来控制的不是进程而是作业或进程组,一个前台作业可以由

  • 作业与进程组的区别

    • 如果作业中的某个进程又创造了子进程,则子进程不属于作业

  • 运行程序时shell的处理:

    •  当作业(进程组)运行起来的时候,shell就把自己提到后台(子进程还在

#include<stdio.h>
int main()
{
    pid_t pid = fork();
    if(pid=-1)
    {
        perror("fork");
        exit(-1);
    }
    else if ( pid==0 )
    {
         while(1)
         printf("child  %d is running\n",getpid());
         sleep(1);
    }
    else
    {
        int i=5;
        while(i)
        printf("parent %d is going to dead %d \n",getpid(),i--);
        sleep(1);
    }
    retrun 0;
}


      当程序开始执行后,前台新起了一个作业,5s内shell无法接受任何命令,此时前台作业不是shell,但5s后父进程退出子进程还在时,shell已经可以接受命令,此时shell变成了前台进程,父进程死亡,该程序前台作业结束,子进程还在则被提到后台运行。

ctrl+c ----退出前台作业(捕捉到信号后将信号发给所有前台作业),杀掉的是整个作业而不是进程

ctrl+z----将进程放到后台运行(处于停止状态,什么都不做,杀不掉,提到前台后立即退出)

T停止状态   kill杀不掉(收到kill信号后依旧停止什么都不干,但提到前台后开始运行会处理kill信号,立即退出)

三、作业控制(shell前后台控制)

jobs                 查看会话中所有工作进程组

可执行程序+&  将进程放在后台运行

ctrl+z               将该进程提到后台,并处于停止状态

bg+作业号       让某个停止的作业在后台继续运行

fg + 作业号      将作业提到前台进程

ctrl+c              退出前台作业,杀死整个前台作业

Linux中进程的5个状态

  • S 睡眠状态

  • T 停止状态

  • Z 僵尸状态

  • D 不可中断睡眠状态

  • R 运行状态

四、作业控制有关的信号

  • SIGTTIN信号:使进程停止

  • SIGCONT信号:让进程继续运行

  • Ctrl+z:向所有前台进程发送SIGTSTP信号,SIGTSTP使进程停止,以后台作业的形式存在

  • 当将一个进程从前台提到后台的时候,会给进程发送一个SIGCONT信号让进程继续运行

五、bash和shell

  • 媒婆---Shell   

    • shell在系统和用户之间起到一个桥梁的作用,并且shell包含bash,是bash等脚本解释器的统称

    • shell是一个命令语言解释器,拥有自己内建的shell命令集。也就是说shell是用户和Linux之间的程序接口,shell将用户在提示符下输入的每个命令都转换成机器语言传给Linux内核。

  • 王婆---Bash   

    • bash是一种shell,Linux中有许多shell,bash是里面通用的一种。bash是众多shell中的其中一个,bash是终端会话的首进程,会话ID就是首进程ID,也就是bash的ID。

六、会话

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

连接的会话首进程被称为控制进程一个会话中,包含控制进程(会话首进程),一个前台和任意后台进程组,每启动一个终端系统就会启动一个会话,启动一个终端会先启动bash,bash就相当于会话首进程,其PID就是会话ID。

注意:并不是所有会话都有一个终端,会话可以脱离一个终端。TTY终端号

  • SID:会话ID

  • pstree

七、守护进程(Daemon)

  • 概念

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

    • Linux启动时会有很多系统服务进程,这些进程没有控制终端,不能直接和用户交互,其他进程都是在用户登录或运行时创建 ,在运行结束或用户注销时终止,但系统服务进程(守护进程)不受用户登录注销的影响,一直运行着,这种进程成为守护进程

  • 特点:

    • 运行在后台

    • 独立于控制终端

    • 周期性的执行某种任务

    • 系统服务进程(守护进程)不受用户登录注销的影响,一直运行着

  • Linux中大多数服务器就是用守护进程实现的,如ssh服务器、ftp服务器、Web服务器 、httpd等均是用守护进程完成的。

  • ps操作系统中的所有进程的信息  ps -ef  -axj  -aux显示进程的不同信息

守护进程信息

  • 凡是TPGID一列是-1的都是没有控制终端的进程,即守护进程

  • COMMAND一列用[ ]括起来的名字,表示内核线程,这些线程在内核中创建,没有空间代码,没有程序文件、没有命令行

  • 守护进程通常采用以d结尾的名字,表示Daemon

    • init是系统的第一个进程

    • undevd负责维护/dev目录下的设备文件

    • acpid负责管理电源

    • syslogd负责维护/var/log下的日志文件

八、创建守护进程

  • pid_t setsid(void)

    • 作用:创建一个新的会话(Session)并成为Session Leader

    • 头文件:#include<unistd.h>

    • 返回值:成功返回新创建的会话的id(当前进程id),出错返回-1

    • 注意:调用该函数的进程不允许是当前进程组的Leader,否则该函数返回-1

  • 调用成功的结果:

    • 创建一个新的会话,当前进程成为Session Leader,当前进程id即为会话id

    • 创建一个新的进程组,当前进程成为进程组的组长,当前进程的id即为进程组id

    • 如果当前进程原本有一个控制终端,则它失去这个控制终端(原来控制终端是打开的,可读写,但只是一个普通的打开文件,而不是控制终端了)

  • 创建一个守护进程的方法

    • 让进程进入后台的方法

      • 命令行:程序+&

      • 程序内部:父子进程中杀死父进程,子进程会进入后台

    • 独立于控制终端

      • setsid()如果调用进程不是进程组长,则创建一个新会话。man 2 系统调用

    • 再次fork()保持子进程不是会话的首进程

  • daemon( ) 创建守护进程的系统函数

  • getcwd()获取当前路径

  • 杀死守护进程

    • 给特定进程发送信号

    • kill  -2   

    • kill  -9

    • 无法接收ctrl +c

    • ctrl+c 不能杀死shell

猜你喜欢

转载自blog.csdn.net/lxf_style/article/details/81281250