`

UNIX环境高级编程 进程关系

 
阅读更多

 

 

相关函数列表

//返回调用进程的进程组ID
#include <unistd.h>
pid_t getpgrp(void);
pid_t getpgid(pid_t pid);
//getpgid(0)  等于  getpgrp()

//创建一个新会话
#include <unistd.h>
pid_t setsid(void);
pid_t getsid(get_t pid);   //返回会话首进程的进程组ID
//对于setsid()函数,如果调用此函数的进程不是一个进程组的组长,则此函数创建一个新会话
//1.该进程变成新会话的会话首进程(session leader会话首进程是创建该会话的进程),此时,该进程
//   是新会话中唯一进程
//2.该进程成为一个新进程组的组长进程。新进程组ID是该调用进程的进程ID
//3.该进程没有控制终端,如果在调用setsid之前该进程有一个控制终端,那么这种联系也被切断
//根据FD获取哪个进程组是前台进程组
#include <unistd.h>
pid_t tcgetpgrp(int fd);
int tcsetpgrp(int fd, pid_t pgrpid);

//给出控制TTY的文件描述符,下面函数可以获得会话首进程的进程组ID
#include <unistd.h>
pid_t tcgetsid(int fd);

 

 

 

终端登录

系统管理者创建/etc/ttys文件,之后init进程读取这个文件,然后fork新进程执行exec调用getty程序

getty对终端设备调用open函数,以读写方式将终端打开,一旦设备打开,则文件描述符就被设置到该设备,然后getty输出“login”之类的信息。getty会根据波特率适当的更改终端的速度。

当用户输入用户名后,getty工作就完成了,然后它调用login程序

execle("/bin/login", "login" "-p", username, (char*)0, envp);

最初的init进程有超级用户权限,所以它fork后的进程都有超级用户权限 

login能处理多项工作,得到用户名调用getpwnam取得相应的用户口令,然后调用getpass提示"password",用户输入口令后,调用crypt将用户口令加密,并与阴影文件的pw_passwd字段比较,如果出错则login调用exit表示登陆失败,父进程init了解到子进程情况后再次调用fork又执行getty,重复上述过程

如果用户登陆正常login就将完成如下工作:

1)将当前工作目录更改为用户的起始目录(chdir)

2)调用chown更改该终端的所有权,使登陆用户成为它的所有者

3)将对该终端设备的访问权限改变为“用户读和写”

4)调用setgid以及initgroups设置进程的组ID

5)用login得到所有信息初始化环境:起始目录(HOME),shell(SHELL),用户名(USER和LOGNAME)以及一个

   系统默认路径(PATH)

6)login进程更改为登陆用户的用户ID(setuid)并调用该用户的登陆shell,其方式类似于

execl("/bin/sh", "-sh", (char*)0);

 

 

网络登陆

init进程调用一个shell,使其执行shell脚本/etc/rc,由此shell脚本启动一个守护进程inetd。一旦shell脚本终止,inetd的父进程就变成init。inetd等待TCP连接达到主机,然后执行一次fork,生成子进程exec执行适当的程序。

当telnet请求达到后,inetd会fork一个进程,然后执行telnetd程序(exec调用),之后分成两个进程,父进程继续处理连接的通讯,子进程执行login程序,父进程和子进程通过伪终端相连接。

执行过程:

1.init调用fork和exec启动inetd

2.inetd接收到客户端的telnet连接,然后fork新进程

3.inetd继续接受客户来的连接,新进程调用exec启动telnetd处理用户逻辑

 

会话

进程组是一个或多个进程的集合,会话是一个或多个进程组的集合

比如proc1 | proc2 & | proc3 | proc4 | proc5

 

会话和进程组还有一些其他特性

1.一个会话可以有一个控制终端(controlling terminal),这通常是终端设备(在终端登录)或伪终端设备(网络)

2..建立与控制终端连接的会话首进程被称为控制进程(controlling process)

3.一个会话中的几个进程组可被分成一个前台进程组(foreground process group)以及一个或多个后台进程

   组(background process group)

4.如果一个会话有一个控制终端,则它有一个前台进程组,其他进程组为后台进程组

5.无论何时键入终端的中断键,都会将终端信号发送至前台进程组的所有进程

6.如果终端接口检测到调制解调器(或网络)已断开连接,则将挂断信号发送至控制进程(会话首进程)


 

 

 

作业控制

允许在一个终端上启动多个作业(进程组),它控制一个作业可以访问该终端以及哪些作业在后台运行。要求以下三种形式的支持:

1.支持作业控制的shell

2.内核中的终端驱动程序必须支持作业控制

3.内核必须提供对某些作业控制信号的支持

 

//这里启动了两个作业
pr *.c | lpr &
make all &

//在后台运行,之后又将作业1号变为前台运行
cat > temp.foo &
fg %1
stty tostop //禁止作业输出至控制终端
 对于前台,后台作业以及终端驱动程序的作业控制功能总结

 

 

 

shell执行程序

//执行下面这段shell
 ps -o pid,ppid,pgid,sid,tpgid,comm | cat | cat | tail | more | head  

//结果
  PID  PPID  PGID   SID TPGID COMMAND
26383 26381 26383 26383 26514 bash
26456 26383 26450 26383 26514 more
26514 26383 26514 26383 26514 ps
26515 26383 26514 26383 26514 cat
26516 26383 26514 26383 26514 cat
26517 26383 26514 26383 26514 tail
26518 26383 26514 26383 26514 more
26519 26383 26514 26383 26514 head

 从结果中可以看到,所有的命令都父进程ID都是bash,也就是bash去启动了那些命令

而ps,cat,cat,tail,more,head这些命令是在一个进程组中的。同时上面所有的进程都是在一个会话中

Bourne shell执行管道ps | cat1 | cat2时的进程


这里执行的sh后,又会fork一个新进程,然后这个新的sh进程再去fork一些子进程,fork的这些子进程都是执行

sh命令,这些sh命令又调用exec函数执行不同的shell命令,比如ps,cat这样的

管道中最后一个shell命令是由最初的sh(PID为202)调用exec执行的

当然这里不同的sh执行会有不同的效果,而且创建的进程顺序也会不同

linux上的bash shell对于所有的执行的管道命令都是bash的子进程 

 

通过pstree命令执行

ps -o pid,ppid,gid,sid,comm | cat | more | head | pstree 
//结果
init-+-bash
     |-6*[mingetty]
     |-sshd---sshd-+-bash
     |             `-bash-+-cat
     |                    |-head
     |                    |-more
     |                    |-ps
     |                    `-pstree
     `-udevd

可以看到init进程for了sshd(也就是终端),然后sshd又fork了bash,

bash调用exec再fork了cat,head,more,ps等命令,生成相应的进程

 

 

 

孤儿进程组

一个其父进程已经终止的进程称为孤儿进程(orphan process),这种进程由init进程收养,而整个进程组也有可能成为孤儿。

POSIX.1将孤儿进程组(orphaned process group)定义为:

该组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。

对孤儿进程组的另一种描述可以使:

一个进程组不是孤儿进程组的条件是---该组中有一个进程,其父进程在属于同一会话的另一个组中。如果进程组

不是孤儿进程组,name在属于同一会话另一个组中的父进程就有机会重新启动该组中停止的进程。在这里,进程组中每一个进程的父进程都属于另一个会话。所以此进程组是孤儿进程组。

 

 

 

FreeBSD实现

会话和进程组的FreeBSD实现


session结构体

1)s_count是该会话中的进程组数。当此计数器减至0时,则可释放此结构

2)s_leader是指向会话首进程proc结构体的指针

3)s_ttyvp是指向控制终端vnode结构的指针

4)s_ttyp是指向控制终端tty结构的指针

5)s_sid是会话id

 

tty结构体

1)t_session指向将此终端作为控制终端的session结构(注意,tty结构指向session结构,session结构也指向

   tty)。终端在市区载波信号时使用此指针将挂起信息发送给会话首进程

2)t_pgrp是指向前台进程组的pgrp结构。终端驱动程序用此字段将信号发送给前台进程组。

3)t_termios是包含所有这些特殊字符和与该终端有关信息(如波特率,回显打开或关闭)的结构

4)t_winsize是包含终端窗口当前大小的winsize型结构。当终端窗口大小改变时,信号SIGWINCH被发送至前台

   进程组。

 

pgrp结构体(包含一个特定进程组的信息)

1)pg_id是进程组ID

2)pg_session指向此进程组所属会话的session结构

3)pg_members是指向此进程组proc结构表的指针,该proc结构代表进程组的成员

 

proc结构体

1)p_pid包含进程ID

2)p_pptr是指向父进程proc结构的指针

3)p_pglist是一个结构,其中包含两个指针,分别指向进程组中上一个和下一个进程

最后还有一个vnode结构,在打开控制终端设备时分配此结构体,进程对/dev/tty的所有访问都通过vnode。

 

 

 

 

 

 

 

  • 大小: 11.5 KB
  • 大小: 31.8 KB
  • 大小: 39 KB
  • 大小: 9.5 KB
  • 大小: 58.9 KB
分享到:
评论

相关推荐

    UNIX环境高级编程-pdf

    此外,书中还涉及了进程环境、系统调用接口、编译和链接、动态装载、错误处理和调试技巧等内容,这些都是在UNIX环境下进行高级编程所必备的知识。同时,书中也讨论了线程编程,包括线程的创建、同步和通信,这对于多...

    UNIX环境高级编程

    《UNIX环境高级编程》是一本深入探讨UNIX系统编程的权威参考书籍。它涵盖了UNIX编程的各个方面,从基础的UNIX系统结构和原理,到文件操作、进程控制、进程间通信、多线程编程、网络编程以及终端I/O和伪终端等内容。...

    UNIX环境高级编程.pdf

    ### UNIX环境高级编程知识点概述 #### 一、UNIX基础知识 **1.1 引言** 在计算机科学领域,操作系统作为连接硬件与软件的桥梁,为应用程序提供了必要的服务,包括但不限于执行新程序、打开文件、读取文件内容、...

    UNIX环境高级编程-009_进程关系

    《UNIX环境高级编程》第9章主要讨论的是进程间的关系,包括进程的父子关系、进程组、对话期的概念,以及登录shell和相关进程之间的交互。这一章的内容是建立在前一章关于进程控制的基础之上的,进一步深入探讨了进程...

    Unix环境高级编程中英文版包括源代码

    《Unix环境高级编程》是一本深受程序员和系统管理员喜爱的经典之作,主要涵盖了在Unix操作系统环境下进行高级编程的各种技术和方法。这本书分为多个章节,详细讲解了Unix系统接口、进程管理、文件系统、网络通信等...

    UNIX环境高级编程(中文第三版)高清完整

    《UNIX环境高级编程(第3版)》在保持前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系...

    UNIX环境高级编程(PDF超清版)

    《UNIX环境高级编程》是一本深受程序员和系统管理员喜爱的经典之作,主要涵盖了在UNIX操作系统上进行高级编程的各种技术和实践。这本书以清晰的结构和深入的解释,为读者提供了丰富的UNIX编程知识,帮助他们掌握在这...

    unix环境高级编程第三版 英文版

    《Unix环境高级编程》(Advanced Programming in the UNIX Environment, 简称APUE) 是一本经典的技术书籍,尤其对于深入理解和开发Unix系统来说是不可或缺的资源。英文第三版更是汇集了作者多年的实践经验与深入的...

    Unix环境高级编程_UNIX环境高级编程_

    《Unix环境高级编程》是一本深入探讨Unix操作系统编程的经典之作,由W. Richard Stevens撰写,是许多计算机科学专业学生和专业开发者的必备参考书。这本书详细介绍了如何在Unix系统上进行系统级编程,包括文件I/O、...

    UNIX环境高级编程课后习题详细解答

    "UNIX环境高级编程"通常涵盖的主题包括进程管理、文件I/O、信号处理、网络编程、系统调用接口以及内存管理等。 课后习题往往旨在巩固和深化对这些概念的理解。以下是一些可能涉及的知识点: 1. **进程管理**:包括...

    UNIX环境高级编程(中文版)

    《UNIX环境高级编程》是一本深受程序员和系统管理员喜爱的经典之作,它由W. Richard Stevens撰写,对中国乃至全球的UNIX和Linux开发者具有深远影响。这本书深入浅出地讲解了在UNIX系统上进行程序开发的各种技术和...

    Unix环境高级编程 非扫描 带目录

    《Unix环境高级编程》是一本深入探讨Unix操作系统编程的经典之作,尤其对于想要在Linux环境下进行C语言编程的开发者来说,这本书具有极高的参考价值。它不仅涵盖了基础的系统调用,还深入到复杂的进程管理、文件操作...

    UNIX环境高级编程(中文第三版.zip

    《UNIX环境高级编程》是Unix系统编程领域的一本经典之作,被誉为“圣书”,对于学习Linux开发技术的人员来说,是一本不可或缺的参考书。这本书深入讲解了在Unix环境下进行系统级编程的各种技术和细节,涵盖了从基本...

    unix环境高级编程1和unix网络编程.进程间通信2.rar

    《Unix环境高级编程》与《Unix网络编程:进程间通信》是两本在计算机科学领域具有深远影响力的经典著作。它们涵盖了Unix系统的核心概念和技术,对于理解操作系统原理、进行系统级编程以及深入研究网络通信有着不可...

    UNIX环境高级编程(清晰PDF中文第一版)

    《UNIX环境高级编程》是一本深受IT专业人士喜爱的经典著作,尤其对于那些致力于深入理解Linux操作系统以及UNIX系统的开发者和系统管理员而言,这本书具有极高的参考价值。作为“学习Linux最好的两本书之一”,它与...

    unix环境高级编程 第三版 文字版非扫码(带目录)

    ### Unix环境高级编程 第三版 知识点详解 #### 一、书籍概述与目标读者 《Unix环境高级编程》第三版是一本针对高级程序员和网络专业人士编写的实用参考书。该系列书籍由Addison-Wesley出版社创建于1990年,旨在为...

    UNIX环境高级编程 第三版 随书代码

    《UNIX环境高级编程》第三版是一本经典的UNIX系统编程指南,涵盖了广泛的UNIX系统接口和编程技术。随书附带的代码库"apue.3e"是作者为书中各章节精心设计的实例,旨在帮助读者深入理解并实践UNIX编程的核心概念。 ...

Global site tag (gtag.js) - Google Analytics