Unix环境高级编程学习笔记(第八章)

第8章 进 程 控 制

每个进程都有一个非负整型的唯一进程I D。有某些专用的进程:进程ID 0是调度进程,常常被称为交换进程( s w a p p e r )。该进程并不执行任何磁盘上的程序—它是内核的一部分,因此也被称为系统进程。进程 ID 1通常是i n i t进程,在自举过程结束时由内核调用。该进程的程序文件在 U N I X的早期版本中是/ e t c / i n i t,在较
新版本中是/ s b i n / i n i t。此进程负责在内核自举后起动一个U N I X系统。i n i t通常读与系统有关的初始化文件( / e t c / r c*文件),并将系统引导到一个状态(例如多用户)。i n i t进程决不会终止。它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程 ),但是它以超级用户特权运行。在某些U N I X的虚存实现中,进程ID 2是页精灵进程( p a g e d a e m o n )。此进程负责支持虚存系统的请页操作。与交换进程一样,页精灵进程也是内核进程。
除了进程I D,每个进程还有一些其他标识符。下列函数返回这些标识符。
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); 返回:调用进程的进程I D
pid_t getppid(void); 返回:调用进程的父进程I D
uid_t getuid(void); 返回:调用进程的实际用户I D
uid_t geteuid(void); 返回:调用进程的有效用户I D
gid_t getgid(void); 返回:调用进程的实际组I D
gid_t getegid(void); 返回:调用进程的有效组I D

一个现存进程调用f o r k函数是U N I X内核创建一个新进程的唯一方法(这并不适用于前节提及的交换进程、i n i t进程和页精灵进程。这些进程是由内核作为自举过程的一部分以特殊方式创建的)。
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
返回:子进程中为0,父进程中为子进程I D,出错为-1
由f o r k创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程 I D。将子进程I D返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进程的进程I D。f o r k使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用g e t p p i d以获得其父进程的进程I D (进程ID 0总是由交换进程使用,所以一个子进程的进程I D不可能为0 )。子进程和父进程继续执行f o r k之后的指令。子进程是父进程的复制品。

练习:程序8-1   fork函数实例

在重新定向父进程的标准输出时,子进程的标准输出也被重新定向。实际上,f o r k的一个特性是所有由父进程打开的描述符都被复制到子进程中。父、子进程每个相同的打开描述符共享一个文件表项

v f o r k用于创建一个新进程,而该新进程的目的是 e x e c一个新程序。v f o r k与f o r k一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用 e x e c (或e x i t ),于是也就不会存访该地址空间。不过在子进程调用 e x e c或e x i t之前,它在父进程的空间中运行。v f o r k和f o r k之间的另一个区别是:v f o r k保证子进程先运行,在它调用e x e c或e x i t之后父进程才可能被调度运行。(如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。)

练习:程序8-2   vfork 函数实例

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值