- 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、exec系列与system、popen区别.doc
fork、exec系列与system、popen区别 作者:蓝色键盘??发表于:2003-05-06 19:52:17 两个问题,请大家一起讨论。 1、fork和exec系列调用前后,进程在内存的“数据段”,“堆栈段”和“代码段”有什么不同?除此以外,fork和exec系列调用还有什么区别? 2、system和popen有什么区别?都常用在什么场合?
【发表回复】【查看论坛原帖】【添加到收藏夹】【关闭】 无双 回复于:2003-05-06 20:00:26
文件描述字在fork和exec中都是保持打开的 我学理这个比较重要
?无双 回复于:2003-05-06 20:01:01
有点跑题了 但是还是请大家思考一下其它比较重要的地方
?uiibono 回复于:2003-05-06 22:42:38
对于fork(): 1、子进程复制父进程的所有进程内存到其内存地址空间中。父、子进程的 ?“数据段”,“堆栈段”和“代码段”完全相同,即子进程中的每一个字节都 和父进程一样。 2、子进程的当前工作目录、umask掩码值和父进程相同,fork()之前父进程 ??打开的文件描述符,在子进程中同样打开,并且都指向相同的文件表项。 3、子进程拥有自己的进程ID。 对于exec(): 1、进程调用exec()后,将在同一块进程内存里用一个新程序来代替调用 ??exec()的那个进程,新程序代替当前进程映像,当前进程的“数据段”, ?“堆栈段”和“代码段”背新程序改写。 2、新程序会保持调用exec()进程的ID不变。 3、调用exec()之前打开打开的描述字继续打开(好像有什么参数可以令打开 ??的描述字在新程序中关闭)
?蓝色键盘 回复于:2003-05-07 09:28:42
1、fork() 一个程序一调用fork函数,系统就为一个新的进程准备了前述三个段,首先,系统让新的进程与旧的进程使用同一个代码段,因为它们的程序还是相同的,对于数据段和堆栈段,系统则复制一份给新的进程,这样,父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行,虽然它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再有影响了,也就是说,它们之间不再共享任何数据了。而如果两个进程要共享什么数据的话,就要使用另一套函数(shmget,shmat,shmdt等)来操作。现在,已经是两个进程了,对于父进程,fork函数返回了子程序的进程号,而对于子程序,fork函数则返回零,这样,对于程序,只要判断fork函数的返回值,就知道自己是处于父进程还是子进程中。 事实上,目前大多数的unix系统在实现上并没有作真正的copy。一般的,CPU都是以“页”为单位分配空间的,象INTEL的CPU,其一页在通常情况下是4K字节大小,而无论是数据段还是堆栈段都是由许多“页”构成的,fork函数复制这两个段,只是“逻辑”上的,并非“物理”上的,也就是说,实际执行fork时,物理空间上两个进程的数据段和堆栈段都还是共享着的,当有一个进程写了某个数据时,这时两个进程之间的数据才有了区? 别,系统就将有区别的“页”从物理上也分开。系统在空间上的开销就可以达到最小。? 2、对于exec系列函数 一个进程一旦调用exec类函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。不过exec类函数中有的还允许继承环境变量之类的信息,这个通过exec系列函数中的一部分函数的参数可以得到。
?蓝色键盘 回复于:2003-05-07 12:41:54
子进程继承了父进程的几乎所有的属性,包括如下: ? . 实际UID,GID和有效UID,GID. ? . 环境变量. ? . 附加GID. ? . 调用exec 时的关闭标志. ? . UID设置模式比特位. ? . GID设置模式比特位. ? . 进程组号. ? . 会话ID. ? . 控制终端. ? . 当前工作目录. ? . 根目录. ? . 文件创建掩码UMASK. ? . 文件长度限制ULIMIT. ? . 预定值, 如优先级和任何其他的进程预定参数, 根据种类不同决定是否可以继承. ? . 还有一些其它属性. 但子进程也有与父进程不同的属性,这点很重要:? . 进程号, 子进程号不同与任何一个活动的进程组号. ? . 父进程号. ? . 子进程继承父进程的文件描述符或流时,具有自己的一个拷贝并且与父进程和其它子进程共享该资源. ? . 子进程的用户时间和系统时间被初始化为0. ? . 子进程的
文档评论(0)