apue:进程关系

进程组

    每个进程除了有一进程ID之外,还属于一个进程组,进程组是一个或多个进程的集合。每个进程组有一个唯一的进程组ID。进程组ID类似于进程ID——它是一个正整数,并可存放在pid_t数据类型中。函数getpgrp返回调用进程的进程。

#include <sys/types.h>
#include <unistd.h>
pid_t getpgrp(void);
/*返回:调用进程的进程组ID*/

    每个进程组有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。进程组组长可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间区间称为进程组的生命期。某个进程组中的最后一个进程可以终止,也可以参加另一个进程组。进程调用setpgid可以参加一个现存的组或者创建一个新进程组。

#include <sys/types.h>
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
/*返回:若成功则为0,出错为-1*/

    这将pid进程的进程组ID设置为pgid。如果这两个参数相等,则由pid指定的进程变成进程组组长。一个进程只能为它自己或它的子进程设置进程组ID。在它的子进程调用了exec后,它就不再能改变该子进程的进程组ID。如果pid是0,则使用调用者的进程ID。另外,如果pgid是0,则由pid指定的进程ID被用作为进程组ID。

对话期

    对话期(session)是一个或多个进程组的集合。进程组和对话期的进程安排如下图所示:
进程组和对话期的进程安排
    进程调用setsid函数就可建立一个新对话期。

#include <sys/types.h>
#include <unistd.h>
pid_t setsid(void);
/*返回:若成功则为进程组ID,若出错则为-1*/

    如果调用此函数的进程不是一个进程组的组长,则此函数创建一个新对话期,结果为:
- 此进程变成该新对话期的对话期首进程(session leader,对话期首进程是创建该对话期的进程)。此进程是该新对话期中的唯一进程。
- 此进程成为一个新进程组的组长进程。新进程组ID是此调用进程的进程ID。
- 此进程没有控制终端。如果在调用setsid之前此进程有一个控制终端,那么这种联系也被解除。
    如果此调用进程已经是一个进程组的组长,则此函数返回出错。

控制终端

    对话期和进程组有一些其他特性:
- 一个对话期可以有一个单独的控制终端(controlling terminal)。这通常是我们在其上登录的终端设备(终端登录情况)或伪终端设备(网络登录情况)。
- 建立与控制终端连接的对话期首进程,被称之为控制进程(controlling process)。
- 一个对话期中的几个进程组可被分成一个前台进程组(foreground process group)以及一个或几个后台进程组(background process group)。
- 如果一个对话期有一个控制终端,则它有一个前台进程组,其他进程组则为后台进程组。
- 无论何时键入中断键(常常是DELETE或Ctrl-C)或退出键(常常是Ctrl-\),就会造成将中断信号或退出信号送至前台进程组的所有进程。
- 如果终端界面检测到调制解调器已经脱开连接,则将挂断信号送至控制进程(对话期首进程。)
    这些特性如下图所示。
对话期和进程组关系

tcgetpgrp和tcsetpgrp函数

    需要有一种方法来通知内核哪一个进程组是前台进程组,这样,终端设备驱动程序就能了解将终端输入和终端产生的信号送到何处。

#include <sys/types.h>
#include <unistd.h>
pid_t tcgetpgrp(int filedes);
/*返回:若成功则为前台进程组ID,若出错则为-1*/
int tcsetpgrp(int filedes, pid_t pgrpid);
/*返回:若成功则为0,若出错则为-1*/

    函数tcgetpgrp返回前台进程组ID,它与在filedes上打开的终端相关。如果进程有一个控制终端,则该进程可以调用tcsetpgrp将前台进程组ID设置为pgrpid。pgrpid值应当是在同一对话期中的一个进程组的ID。filedes必须引用该对话期的控制终端。

作业控制

    作业控制允许在一个终端上起动多个作业(进程组),控制哪一个作业可以存取该终端,以及哪些作业在后台运行。作业控制要求三种形式的支持:
- 支持作业控制的shell。
- 内核中的终端驱动程序必须支持作业控制。
- 必须提供对某些作业控制信号的支持。
    从shell使用作业控制功能角度观察,可以在前台或后台起动一个作业。一个作业只是几个进程的集合,通常是一个进程管道。
    有三个特殊字符可使终端驱动程序产生信号,并将它们送至前台进程组,它们是:
- 中断字符(一般采用DELETE或Ctrl-C)产生SIGINT。
- 退出字符(一般采用Ctrl-\)产生SIGQUIT。
- 挂起字符(一般采用Ctrl-Z)产生SIGTSTP。

孤儿进程组

    一个父进程已终止的进程称为孤儿进程(orphan process),这种进程由init进程收养。

本书全面介绍了UNIX系统的程序设计界面—系统调用界面和标准C库提供的许多函数。 本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、 进程间通信以及各种I/O。在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库, PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威, 概念清晰精辟,一直以来被誉为UNIX编程的“圣经”,对于所有UNIX程序员—无论是初学者还是专家级人士 —都是一本无价的参考书籍。 目 录 译者序 译者简介 前言 第1章 UNIX基础知识 1 1.1 引言 1 1.2 登录 1 1.2.1 登录名 1 1.2.2 shell 1 1.3 文件和目录 2 1.3.1 文件系统 2 1.3.2 文件名 2 1.3.3 路径名 2 1.3.4 工作目录 4 1.3.5 起始目录 4 1.4 输入和输出 5 1.4.1 文件描述符 5 1.4.2 标准输入、标准输出和标准 出错 5 1.4.3 不用缓存的I/O 5 1.4.4 标准I/O 6 1.5 程序和进程 7 1.5.1 程序 7 1.5.2 进程进程ID 7 1.5.3 进程控制 7 1.6 ANSI C 9 1.6.1 函数原型 9 1.6.2 类属指针 9 1.6.3 原始系统数据类型 10 1.7 出错处理 10 1.8 用户标识 11 1.8.1 用户ID 11 1.8.2 组ID 12 1.8.3 添加组ID 12 1.9 信号 12 1.10 UNIX时间值 14 1.11 系统调用和库函数 14 1.12 小结 16 习题 16 第2章 UNIX标准化及实现 17 2.1 引言 17 2.2 UNIX标准化 17 2.2.1 ANSI C 17 2.2.2 IEEE POSIX 18 2.2.3 X/Open XPG3 19 2.2.4 FIPS 19 2.3 UNIX实现 19 2.3.1 SVR4 20 2.3.2 4.3+BSD 20 2.4 标准和实现的关系 21 2.5 限制 21 2.5.1 ANSI C限制 22 2.5.2 POSIX限制 22 2.5.3 XPG3限制 24 2.5.4 sysconf、pathconf 和fpathconf 函数 24 2.5.5 FIPS 151-1要求 28 2.5.6 限制总结 28 2.5.7 未确定的运行时间限制 29 2.6 功能测试宏 32 2.7 基本系统数据类型 32 2.8 标准之间的冲突 33 2.9 小结 34 习题 34 第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 3.11.1 添加至一个文件 45 3.11.2 创建一个文件 45 3.12 dup和dup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 65 4.11 chown, fchown和 lchown函数 66 4.12 文件长度 67 4.13 文件截短 68 4.14 文件系统 69 4.15 link, unlink, remove和rename 函数 71 4.16 符号连接 73 4.17 symlink 和readlink函数 76 4.18 文件的时间 76 4.19 utime函数 78 4.20 mkdir和rmdir函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值