APUE读书笔记-第8章进程控制

第8章 进程控制
8.1 引言
*进程控制包括创建新进程、执行程序、进程终止


8.2 进程标识符
*每个进程都有一个非负整型的唯一进程ID。因为进程ID标识符总是唯一的,常将其用作其它标识符的一部分以保证其唯一性。例如,应用程序有时就把进程ID作为名字的一部分来


创建一个唯一的文件名
*ID为0的进程通常是调度进程,常常被称为交换进程(swapper)
*ID为1的进程通常是init进程,在自举过程结束时由内核调用
*ID为2的进程在某些UNIX的虚拟存储器实现中,页守护进程(pagedaemon)。此进程负责支持虚拟存储系统的分页操作


8.3 fork函数
*由fork创建的新进程被称为子进程(child process)
*fork函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID
*由于在fork之后经常跟随着exec,所以现在的很多实现并不执行一个父进程数据段、栈、堆的完全复制。作为替代,使用了写时复制(Copy-On-Write,COW)技术
*在fork之后处理文件描述符有两种常见的情况
(1)父进程等待子进程完成。
(2)父子进程各自执行不同的程序段


8.4 vfork函数
*vfork与fork相同之处:都创建一个子进程
*vfork与fork不同之处:
(1)vfork并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec/exit,于是也就不会存访该地址空间。相反,在子进程调用exec/exit之前,它在父进程的空


间中运行
(2)vfork保证子进程先运行,在它调用exec/exit之后父进程才可能被调度运行。


8.5 exit函数
*进程有五种正常终止方式:
(1)在main函数内执行return语句
(2)调用exit函数
(3)调用_exit或_Exit函数
(4)进程的最后一个线程在其启动例程中执行返回语句
(5)进程的最后一个线程调用pthread_exit函数
*三种异常终止方式:
(1)调用abort
(2)当进程接收到某些信号时
(3)最后一个线程对"取消(cancellation)"请求做出响应
*在UNIX术语中,一个已经终止、但是父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程被称为僵死进程(zombie)


8.6wait和waitpid函数
*调用wait或waitpid的进程可能会发生这些情况:
(1)如果其所有子进程都还在运行,则阻塞
(2)如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回
(3)如果它没有任何子进程,则立即出错返回






8.7 waitid函数
*与waitpid相似,waitpid允许一个进程指定要等待的子进程。但它使用单独的参数表示要等待的子进程类型,而不是将此ID或进程组ID组合成一个参数。


8.8 wait3和wait4函数
资源统计信息包括用户CPU时间总量,系统CPU时间总量,页面出错次数,接收到信号的次数等。


8.9 竞争条件
*当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,则我们认为这发生了竞争条件(race condition)
*为了避免竞争条件和轮询,在多个进程之间需要有某种形式的信号发送和接收的方法。在UNIX中可以使用信号机制,也可使用各种形式的进程间通信(IPC)


8.10 exec函数
*exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段
*用fork可以创建新进程,用exec可以执行新程序,exit函数和两个wait函数处理终止和等待终止


8.11 更改用户ID和组ID
*一般而言,在设计应用程序时,我们总是试图使用最小特权模型(least privilege)。依照此模型,我们的程序应当只具有为完成给定任务所需的最小特权


8.12 解释器文件
*所有现今的UNIX系统都支持解释器文件(interpreter file)。这种文件是文本文件,其起始行的形式是
#! pathname [optional-argument]
感叹号和pathname之间的空格是可选的,最常见的解释器文件以下列行开始:
#!/bin/sh


8.13 system函数
*使用system函数而不是直接使用fork和exec的优点是:system进行了所需的各种出错处理,以及各种信号处理

 

8.14 进程会计

*大多数UNIX系统提供了一个选项进行进程会计(process accounting)处理。启用该选项后,每当进程结束时内核就写一个会计记录。典型的会计记录包含总量最小的二进制数据,一般包括命令名、所使用的CPU时间总量、用户ID和组ID、启动时间等

 

8.15进程标识

*如果一个用户有多个登录名,这些登录名又对应着同一个用户ID,该怎么获取运行某一程序的用户登录名呢?系统通常记录用户登录时使用的名字,用getlogin函数可以获取此登录名。

 

8.16进程时间

*任一进程都可调用times函数以获得它自己及已终止子进程的墙上时钟时间、用户CPU时间、系统CPU时间

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值