linux下stdinstdoutstderr.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用户操作? Linux 下 stdin stdout stderr 的由来? HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+u=+escape(d.location.href)+c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes));saveit.focus(); \o 收藏到我的网摘中,并分享给我的朋友 收藏 现在就从linux kernel的源代码的角度来分析该。 二:fork()与execve()中stderr,stdio.stdout的继承关系? 其实用继承这个词好像不太准确,要准确一点,可能复制更适合.? 首先有二点:? 1:父进程fork出子进程后,是共享所有文件描述符的(实际上也包括socket)? 2:进程在execve后,除了用O_CLOEXEC标志打开的文件外,其它的文件描述符都是会复制到下个执行序列(注意这里不会产生一个新进程,只是将旧的进程替换了)? 下面我们从代码中找依据来论证以上的两个观点.? 对于第一点:? 我们在分析进程创建的时候,已经说过,如果父过程在创建子进程的时候带了CLONE_FILES标志的时候,会和父进程共享task-files.如果没有定义,就会复制父进程的task-files.无论是哪种情况,父子进程的环境都是相同的.? 代码如下:? static int copy_files(unsigned long clone_flags, struct task_struct * tsk)? {? ???? struct files_struct *oldf, *newf;? ???? int error = 0;? ???? oldf = current-files;? ???? if (!oldf)? ???????? goto out;? ???? if (clone_flags CLONE_FILES) {? ???????? atomic_inc(oldf-count);? ???????? goto out;? ???? }? ???? tsk-files = NULL;? ???? newf = dup_fd(oldf, error);? ???? if (!newf)? ???????? goto out;? ???? tsk-files = newf;? ???? error = 0;? out:? ???? return error;? }? 从上面的代码可以看出.如果带CLONE_FILES标志,只是会增加它的引用计数.否则,打开的文件描符述会全部复制.? 对于二:? 我们之前同样也分析过sys_execve().如果有不太熟悉的,到本站找到相关文章进行阅读.在这里不再详细说明整个流程.相关代码如下:? static void flush_old_files(struct files_struct * files)? {? ???? long j = -1;? ???? struct fdtable *fdt;? ???? spin_lock(files-file_lock);? ???? for (;;) {? ???????? unsigned long set, i;? ???????? j++;? ???????? i = j * __NFDBITS;? ???????? fdt = files_fdtable(files);? ???????? if (i = fdt-max_fds)? ????????????? break;? ???????? set = fdt-close_on_exec-fds_bits[j];? ???????? if (!set)? ????????????? continue;? ???????? fdt-close_on_exec-fds_bits[j] = 0;? ???????? spin_unlock(files-file_lock);? ???????? for ( ; set ; i++,set = 1) {? ????????????? if (set 1) {? ?????????????????? sys_close(i);? ??

文档评论(0)

187****5045 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档