现在的位置: 首页 > 综合 > 正文

进程编程2 – Unix环境高级编程8章读书笔记

2013年08月11日 ⁄ 综合 ⁄ 共 2679字 ⁄ 字号 评论关闭

Process Control

1 Process Identifiers

1.     PID=0一般是调度进程,又称为swapper

2.     PID=1一般是init进程,在引导过程之后启动,负责启动整个UNIX系统,所有Orphaned子进程都会自动成为init的子进程

3.     PID=2一般是页面守护进程,负责将虚拟内存的换页

4.     下面函数被用来获得pid

#include

 

pid_t getpid(void);

 

返回进程pid

 

pid_t getppid(void);

 

返回父进程的pid

 

uid_t getuid(void);

 

返回进程的user id

     

uid_t geteuid(void);

 

返回进程的effective user id

 

gid_t getgid(void);

 

返回进程的group id

 

gid_t getegid(void);

 

返回进程的effective group id

 

2 fork

fork函数原型如下:

#include

 

pid_t fork(void);

 

在子进程中返回0,父进程中返回实际的子进程pid-1则出错

1.     这个函数创建出一个和父进程相同的子进程,比较特别的是子进程也会从这个函数调用,和父进程只是返回值不同。

2.     子进程起初和父进程共享同样的物理内存,当某个页面被修改的时候,系统会给子进程分配新的空间给这个页面。这个行为被称为COW (Copy On Write)

3.     父进程还是子进程先继续执行无法预测

4.     父进程的所有文件描述符在子进程中都被调用dup函数复制,并且文件offset是在子进程和父进程之中共享的

5.     子进程继承了父进程的下列特性:

a.     File Descriptors

b.     Real user ID, real group ID, effective user ID, effective group ID

c.     Supplementary group IDs

d.     Process group ID

e.     Session ID

f.      Controlling terminal

g.     Set-user-ID & set-group-ID flags

h.     Working directory

i.      Root directory

j.      File mode creation mask

k.     Signal mask & dispositions

l.      The close-on-exec flag for any open file descriptions

m.    Environment

n.     Attached shared memory segments

o.     Memory mapping

p.     Resource limits

6.     子进程和父进程不同的地方有:

a.     fork函数的返回值

b.     Process ID

c.     Parent process ID

d.     tms_utime, tms_stime, tms_cutime, tms_cstime = 0

e.     File lock不被子进程继承

f.      Pending alarm被清除

g.     Pending signal被清除

7.     fork失败的可能性有:

a.     系统中的进程过多

b.     超过系统设置的limit

3 vfork

vfork的原型和返回值和fork相同,区别在于:

1.     创建的子进程和父进程共享同一个地址空间

2.     创建的子进程一般的作用是再调用exec创建一个新的进程,在某些系统上可能会有一些优化

4 exit

1.     当父进程先于子进程退出的时候,子进程会变成orphaned并被init进程“收养”,init成为这些子进程的新的父进程。

2.     当子进程先于父进程退出的时候,而且父进程也没有用wait, waitpid函数等待子进程结束,则子进程的部分信息会被保存起来,如PID,退出状态,CPU时间等,直到子进程被wait。处于这样状态的子进程被称为zombie

3.     init进程inherit的子进程如果中止不会变成zombie,因为init会自动当进程结束的时候调用wait

5 wait & waitpid

1.     当子进程结束的时候,父进程会收到SIGCHLD通知

2.     进程可以调用wait / waitpid等待此Signal

a.     当所有子进程都在执行的时候,会block

b.     当某个子进程中止,成为zombie的时候,立刻返回

c.     如果没有任何子进程,则返回错误

3.     waitwaitpid函数原型如下:

#include

 

pid_t wait(void);

 

pid_t waitpid(pid_t pid, int *statloc, int options);

 

正常情况下返回pid,或者0waitpid在非block模式下才有可能返回),-1代表错误

 

4.     这两个函数区别如下:

a.     Wait函数会因为等待子进程结束而block,而waitpid有一个option可以允许waitpid函数不block

b.     waitpid等待某个特定进程

5.     waitpid函数的statloc参数保存了退出进程的状态,当然也可以传NULL。这个状态通常和实现相关,不过可以用wait.h中定义的macro来检测。

a.     WIFEXITED(status):返回值

b.     WIFSIGNALED(status):返回造成退出的signalnumber

c.     WIFSTOPPED(status):是否被stop,可以用WSTOPSIGstatus)来获得具体的signal

d.     WIFCONTINUED(status):返回是否被continue

6.     waitpidpid参数:

a.     pid == -1:等待任意子进程,等价于wait

b.     pid > 0,等待pid指定的子进程

c.     pid == 0,等待和调用进程相同group id的任意子进程

d.     pid ,等待任意group id = pid的绝对值的子进程

7.     waitpidoptions参数可以是下面的组合:

a.     WCONTINUED:等待任何指定的子进程在stop之后被continue

b.     WNOHANG:如果还没有退出,不block,返回0

c.     WUNTRACED:被stopped的进程

抱歉!评论已关闭.