注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

魑魅魍魉福'HOME

见证成长

 
 
 

日志

 
 

【引用】关于close-on-exec标志  

2011-03-10 15:50:09|  分类: C |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自落痕《关于close-on-exec标志》
每个文件描述符都有一个close-on-exec标志。默认情况下,这个标志最后一位被设置为 0。这个标志符的具体作用在于当开辟其他进程调用exec()
族函数时,在调用exec函数之前为exec族函数释放对应的文件描述符。
    1. 我们来看一下具体的实例:

这是两个程序: file:fcntl
代码
int main()
{
pid_t pid;
fd = open("test.txt",O_RDWR|O_APPEND);
if (fd == -1)
##printf("open err\n");
printf("fd = %d",fd);
printf("fork!\n");
fcntl(fd, F_SETFD, 1);                    
char *s="ooooooooooooooooooo";
pid = fork();
if(pid == 0)
execl("ass", "./ass", &fd, NULL);

wait(NULL);

write(fd,s,strlen(s));
close(fd);

return 0;
}

ass 源代码
int main(int argc, char *argv[])
{
int fd;
printf("argc = %d ",argc);
fd = *argv[1];
printf("fd = %d",fd);
char *s = "zzzzzzzzzzzzzzzzzzz";
write(fd, (void *)s, strlen(s));
close(fd);
return 0;
}
PS:那个test.txt提前已经创建 为空文件~

fcntl(fd, F_SETFD, 1) 此句将fd的close-on-exec 标志设置为1,开启此标志。那么当子进程调用execl函数
时,execl执行ass,ass是不能向fd内写入的,因为在调用execl函数之前系统已经讲子进程的此文件描述符关闭了。(attention:这里是子进程!)
但是如果将 fcntl(fd, F_SETFD, 1)
改为
fcntl(fd, F_SETFD, 0)
或者直接将此句注释掉,那么,ass便可以向这个文件描述符中任意添写东西了~~
PS:如果将fcntl设置为开启,即设置为1,那么, 此文件描述符依然是可以被主进程操作的。
下面将程序执行的结过给大家:
当执行此句fcntl(fd, F_SETFD, 1)
fd = 3fork!
argc = 2 fd = 3
test.txt中的内容为:
ooooooooooooooooooo
当将fcntl(fd, F_SETFD, 1)注释掉或者将 1改为 0时
结果:
fd = 3fork!
argc = 2 fd = 3lost
test.txt中的内容为:
zzzzzzzzzzzzzzzzzzoooooooooooooooooooooo
  评论这张
 
阅读(633)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018