<<UNIX环境高级编程>>之第八章理解

第八章.进程控制:
一.引言:
进程控制:包括创建新进程,执行程序,进程终止.还将说明进程的各种ID–实际,有效和保存的用户和组ID,以及它们如何受到进程控制原语的影响.
二.进程标识:
每个进程都有一个非负整形的唯一进程ID.因为进程ID标识符总是唯一的,常将其用作其他标识符的一部分以保证其唯一性.
有某些专用的进程:进程ID 0是调度进程,常常被曾为交换进程(swapper).该进程并不执行任何磁盘上的程序–它是内核的一部分,因此也被称为系统进程.进程ID 1通常是init进程.init进程决不会终止.它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程),但是它以超级用户特权运行.在某些unix的虚存实现中,进程ID 2是页精灵进程(pagedaemon,后会讲什么是daemon).
三.fork函数:
一个现存进程调用fork函数是unix内核创建一个新进程的唯一方法(这个方法并不适用于前节提及的交换进程,init进程和页精灵进程.这些进程是由内核作为自举过程的一部分以特殊方式创建的).
由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回两次.两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID,将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多余一个,所以没有一个函数使一个进程可以获得所有子进程的进程ID.fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID(进程ID 0 总是由交换进程使用,所以一个子进程的进程ID不可能是0).
子进程和父进程继续执行fork后的指令.子进程是父进程的复制品.例如,子进程获得父进程数据空间,堆和栈的复制品.注意,这是子进程所拥有的拷贝,父,子进程并不共享这些存储空间部分.如何正文段是只读的,则父,子进程共享正文段.
四.vfork函数:
vfork函数的调用序列和返回值fork相同,但两者语义不同.
vfork函数用于创建一个新进程,而该新进程的目的是exec一个新程序.vfork和fork一样都创建了一个子进程,
但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),于是也就不会存访该地址空间.不过在子进程调用exec或exit之前,它在父进程的空间中运行.
vfork与fork的另一个区别:vfork保证子进程先运行(fork是否子进程先运行得看系统具体调用),在它调用exec或exit之后父进程才可能被调度运行.
五.exit函数:
上章已经提过了.
六.wait和waitpid函数:
wait:不管一个进程有几个子进程,父进程执行wait的时候就一直在那里等,不管哪个子进程终止,wait就返回其ID;
waitpid:通过设置pid参数,可以等待任一子进程(-1),或者等待指定子进程(>0),或者等待group ID的相关进程(不多说了)等。
七.竞态条件:
当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,则我们认为这发生了竞态条件.(race condition)
八.exec函数:
这里写图片描述
九.更改用户ID和组ID:
可以用setuid函数设置实际用户ID和有效用户ID.与此类似,可以用setgid函数设置实际组ID和有效组ID.
更改ID规则:
考虑有关改变用户ID的规则:
1.若进程具有超级用户特权,则setuid函数将实际用户ID,有效用户ID,以及保存的set-user-ID设置为uid.
2.若进程没有超级用户特权,但是uid等于实际用户ID或保存的set-user-ID,则setuid只将有效用户ID设置为uid.不改变实际用户ID和保存的set-user-ID.
3.如果上面两个条件都不满足,则errno设置为EPERM,并返回出错.
关于内核所维护的三个用户ID,还要注意下列几点:
1.只有超级用户进程可以更改实际用户ID.通常,实际用户ID是在用户登录时,由login程序设置的,而且决不会改变它.因为login是一个超级用户进程,当它调用setuid时,设置所有三个用户ID.
2.仅当对程序文件设置了set-user-ID位时,exec函数设置有效用户ID.如果set-user-ID位没有设置,则exec函数不会改变有效用户ID,而将其维持原先值.任何时候都可以调用setuid,将有效用户ID设置为实际用户ID或保存的set-user-ID.
3.保存的set-user-ID是由exec从有效用户ID复制的.在exec按文件用户ID设置了有效用户ID后,即进行这种复制,并将此副本保存起来.
这里写图片描述
九.setreuid和setregid函数:
功能是交换实际用户ID和有效用户ID的值.
十.seteuid和setegid函数:
功能是更改有效用户ID和有效组ID.
十一.组ID
前文所说对用户ID所做的一切都适用于对于各个组ID.添加组ID不受setgid函数的影响.
十二.解释器
http://www.cnblogs.com/sword03/archive/2010/06/27/1766147.html
首先建这篇文章我们能形象生动的认识到编译器与解释器的区别.

#include <unistd.h>
int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ );
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg0, ...
/* (char *)0, char *const envp[] */ );
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, ... /* (char *)0 */ );
int execvp(const char *filename, char *const argv[]);
int fexecve(int fd, char *const argv[], char *const envp[]);
/*All seven return: −1 on error, no return on success*/

这是所有exec函数格式.关系图在上方.
只有execve是system call,其他6个都是library function.
解释器文件的文本文件,其起始行的形式是:

#!pathname[optional-argument]
在惊叹号和pathname之间的空格是可任选的.最常见的是以下行开始:
#!/bin/sh

十三.system function:
ISO C 定义,对操作系统依赖性很强,用于调用shell中的命令,具体用法man一下即可。
十四.accounting process:
进程终止时写一个account 记录。
十五.进程调度:
每个进程有个nice值,nice值越小,优先级越高

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值