fcntl的close-on-exec标志

原文地址:http://blog.163.com/tlost_heaven/blog/static/79246122200910239562451/

每个文件描述符都有一个close-on-exec标志。默认情况下,这个标志最后一位被设置为 0。这个标志符的具体作用在于当开辟其他进程调用exec()族函数时,在调用exec函数之前为exec族函数释放对应的文件描述符。

我们来看一下具体的实例。这是两个程序:

//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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值