进程组,作业,会话

来源:互联网 发布:java项目maven打包jar 编辑:程序博客网 时间:2024/06/14 16:14

一,概念解析

1,进程组:进程组是一个或多个进程的组合,他们与同一作业相关联,可以接收来自同一终端的各种信号,每个进程除了有pid 还有pgid,;每个进程组都有唯一的进程组id,也是组长进程的pid;组长进程可以创建一个进程组,创建完该组中的进程,然后终止,一个进程组中只有还有一个进程,则该进程组就存在,与组长进程是否存在无关,

2,作业:shell控制的不是进程而是作业,shell可以运行一个前台进程和任意多个后台进程,如何区分作业和进程组,在一个作业中创建的子进程不再属于该作业而是属于进程组;如果一个作业运行完则shell自动将自己提到前台,如果该进程组还没有运行完(创建的子进程),它自动变为后台进程组;

3,会话:包含一个控制进程,一个前台进程组和任意多个后台进程,一个会话有一个控制终端,建立与控制终端连接的会话首进程称为控制进程,

二,终端;

1.用户通过终端登录后得到一个shell进程,这个终端成为shell进城的控制终端,控制终端是写在pcb中的,fork会复制Pcb中的信息,所以由shell进程启动的其他进程的控制终端也是此控制终端;

2.默认情况下,一个进城的标准输入,输出,错误输出都指向控制终端;重定向可以改变默认情况;

3.在控制终端给前台进程发送{ctrl+c(SIGINT),ctrl+\(SIGQUIT),ctrl+z(SIGTSTP)}可以结束前台进程;

4,通过设备文件dev/tty可以查看控制终端,ttyname(int)可以由文件描述符查出对应的终端设备文件;


三。作业控制

1, ps -o pid ,ppid,pgrp,session,tpgid,common | cat

[lianjiao@localhost linux]$ ps -o pid,ppid,pgrp,session,tpgid,comm | cat  PID  PPID  PGRP  SESS TPGID COMMAND 2436  2434  2436  2436  9298 bash 9298  2436  9298  2436  9298 ps 9299  2436  9298  2436  9298 cat
bash进程是cat进程和ps进程的父进程,这三个进程在同一会话中,bash是session leader,其中cat 和ps在同一进程组,ps进程id也就是进程组id,bash在后台进程,

2,jobs查看当前有哪些作业,fg %1可以将1号进程提到前台;若1号作业停止运行,给此进程组的每个进程发送SIGCOUNT使其继续运行;

3.输入Ctrl+z,则是给所有前台进程发送SIGTSTP信号。该信号默认是前台进程停止,以后台形式存在;

4,bg可以让某个停止的进程在后台继续运行,SIGCOUNT信号,cat进程继续运行,由于此时cat进程是后台进程不能读终端收入,有收到一个SIGTTIN信号,又停止;



四,守护进程

1,概念:守护进程也称为精灵进程,是运行在后台的一种特殊进程,它独立于控制终端周期性的执行某种任务,或者等待处理某些发生的事情,不能直接和用户交互,linux大  多数服务器就是用守护进程实现的;

linux启动时会启动很多系统服务进程,这些进程没有终端不能和用户直接交互,其他进程都是在用户登陆或运行程序时产生,在运行结束或用户注销时终止,系统服务进程不受

用户登录注销的影响,他们一直运行,系统服务进程还有个名字叫守护进程;

2,守护进城的创建

创建守护进程最关键的一部就是调用setsid函数创建一个新的session,并且成为Session Leader,

#include<unistd.h>pid_t setsid(void);
调用成功则返回新的session的id,失败就返回-1;
当前进程不能是组长进程,否则返回-1,使用fork()可以避免这种问题;

成功调用的结果;

1,创建一个新的会话,当前进程是session leader

2,创建一个新的进程组,当前进程是组长进程;

3,如果当前进程有一个控制终端,则它失去控制终端;

#include<stdlib.h>#include<unistd.h>#include<signal.h>void mydaemon(){umask(0);pid_t id=fork();if(id>0){exit(0);}setsid();//chuangjianjinglingjincheng;chdir("/");close(0);close(1);close(2);signal(SIGCHLD,SIG_IGN);}int main(){mydaemon();return 0;}