- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
创建新进程:fork函数
创建新进程:fork函数1.fork函数干什么?#include sys/types.h#include unistd.hpid_t fork(void);‘fork()’函数用于从已存在进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。你可以通过检查fork()’函数的返回值知道哪个是父进程,哪个是子进程。父进程得到的返回值是子进程的进程号,而子进程则返回0。以下这个范例程序说明它的基本功能:pid_t pid;switch (pid = fork()){case -1:/* 这里pid为-1,fork函数失败 *//* 一些可能的原因是 *//* 进程数或虚拟内存用尽 */perror(The fork failed!);break;case 0:/* pid为0,子进程 *//* 这里,我们是孩子,要做什么? *//* ... *//* 但是做完后, 我们需要做类似下面: */_exit(0);default:/* pid大于0,为父进程得到的子进程号 */printf(Childs pid is %d\n,pid);}当然,有人可以用‘if() ... else ...’语句取代‘switch()’语句,但是上面的形式是一个有用的惯用方法。知道子进程自父进程继承什么或未继承什么将有助于我们。下面这个名单会因为不同Unix的实现而发生变化,所以或许准确性有了水份。请注意子进程得到的是这些东西的 *拷贝*,不是它们本身。由子进程自父进程继承到:* 进程的资格(真实(real)/有效(effective)/已保存(saved) 用户号(UIDs)和组号(GIDs))* 环境(environment)* 堆栈* 内存* 打开文件的描述符(注意对应的文件的位置由父子进程共享,这会引起含糊情况)* 执行时关闭(close-on-exec) 标志 (译者注:close-on-exec标志可通过fnctl()对文件描述符设置,POSIX.1要求所有目录流都必须在exec函数调用时关闭。更详细说明,参见UNIX环境高级编程 W. R. Stevens, 1993, 尤晋元等译(以下简称高级编程), 3.13节和8.9节)* 信号(signal)控制设定* nice值 (译者注:nice值由nice函数设定,该值表示进程的优先级,数值越小,优先级越高)* 进程调度类别(scheduler class) (译者注:进程调度类别指进程在系统中被调度时所属的类别,不同类别有不同优先级,根据进程调度类别和nice值,进程调度程序可计算出每个进程的全局优先级(Global process prority),优先级高的进程优先执行)* 进程组号* 对话期ID(Session ID) (译者注:译文取自高级编程,指:进程所属的对话期(session)ID, 一个对话期包括一个或多个进程组, 更详细说明参见高级编程9.5节)* 当前工作目录* 根目录 (译者注:根目录不一定是“/”,它可由chroot函数改变)* 文件方式创建屏蔽字(file mode creation mask (umask)) (译者注:译文取自高级编程,指:创建新文件的缺省屏蔽字)* 资源限制* 控制终端子进程所独有:* 进程号* 不同的父进程号(译者注:即子进程的父进程号与父进程的父进程号不同,父进程号可由getppid函数得到)* 自己的文件描述符和目录流的拷贝(译者注:目录流由opendir函数创建,因其为顺序读取,顾称“目录流”)* 子进程不继承父进程的进程,正文(text),数据和其它锁定内存(memory locks)(译者注:锁定内存指被锁定的虚拟内存页,锁定后,不允许内核将其在必要时换出(page out),详细说明参见The GNU C Library Reference Manual 2.2版,1999, 3.4.2节)* 在tms结构中的系统时间(译者注:tms结构可由times函数获得,它保存四个数据用于记录进程使用中央处理器(CPU:Central Processing Unit)的时间,包括:用户时间,系统时间,用户各子进程合计时间,系统各子进程合计时间)* 资源使用(resource utilizations)设定为0* 阻塞信号集初始化为空集(译者注:原文此处不明确,译文根据fork函数手册页稍做修改)* 不继承由timer_create函数创建的计时器* 不继承异步输入和输出2. fork函数 与 vfork函数的区别在哪里里?有些系统有一个系统调用‘vfork()’,它最初被设计成‘fork()’的较少额外支出(lower-overhead)版本。因为‘fork()’包括拷贝整个进程的地址空间,所以非常“昂贵”,这个‘vfork()’函
文档评论(0)