fcntl设置FD_CLOEXEC标志作用

原创 2011年11月02日 22:11:05
通过fcntl设置FD_CLOEXEC标志有什么用?
close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用。
eg:
jamie@jamie-laptop:~$ cat test.c
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
        int fd,pid;
        char buffer[20];
        fd=open("wo.txt",O_RDONLY);
        printf("%d/n",fd);
        int val=fcntl(fd,F_GETFD);
        val|=FD_CLOEXEC;
        fcntl(fd,F_SETFD,val);

        pid=fork();
        if(pid==0)
        {
                //子进程中,此描述符并不关闭,仍可使用
                char child_buf[2];
                memset(child_buf,0,sizeof(child_buf) );
                ssize_t bytes = read(fd,child_buf,sizeof(child_buf)-1 );
                printf("child, bytes:%d,%s/n/n",bytes,child_buf);

                //execl执行的程序里,此描述符被关闭,不能再使用它
                char fd_str[5];
                memset(fd_str,0,sizeof(fd_str));
                sprintf(fd_str,"%d",fd);
                int ret = execl("./exe1","exe1",fd_str,NULL);
                if(-1 == ret)
                        perror("ececl fail:");
        }        

        waitpid(pid,NULL,0);
        memset(buffer,0,sizeof(buffer) );
        ssize_t bytes = read(fd,buffer,sizeof(buffer)-1 );
        printf("parent, bytes:%d,%s/n/n",bytes,buffer);
}

jamie@jamie-laptop:~$ cat exe1.c
#include <fcntl.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>

int main(int argc, char **args)
{
        char buffer[20];
        int fd = atoi(args[1]);
        memset(buffer,0,sizeof(buffer) );
        ssize_t bytes = read(fd,buffer,sizeof(buffer)-1);
        if(bytes < 0)
        {
                perror("exe1: read fail:");
                return -1;
        }
        else
        {
                printf("exe1: read %d,%s/n/n",bytes,buffer);
        }
        return 0;
}

jamie@jamie-laptop:~$ gcc -o exe1 exe1.c
jamie@jamie-laptop:~$ gcc -o test test.c
jamie@jamie-laptop:~$ cat wo.txt
this is a test
jamie@jamie-laptop:~$ ./test
3
child, bytes:1,t                               //子进程中可使用fd

exe1: read fail:: Bad file descriptor  //execl调用的程序中不能使用fd
parent, bytes:14,his is a test          //父进程中当然能使用fd

fcntl使用及FD_CLOEXEC详解

fcntl使用说明 转自 http://www.cppblog.com/mysileng/archive/2013/01/15/197279.aspx 功能描述:根据文件描述词来操作文件的特性...
  • chrovery
  • chrovery
  • 2015年09月18日 14:00
  • 1846

O_CLOEXEC模式和FD_CLOEXEC选项

O_CLOEXEC模式和FD_CLOEXEC选项 调用open函数O_CLOEXEC模式打开的文件描述符在执行exec调用新程序中关闭,且为原子操作。 调用open函数不使用O_CLOEXEC模式打开...
  • lh842824672
  • lh842824672
  • 2016年05月13日 11:07
  • 1750

浅析open函数O_CLOEXEC模式和fcntl函数FD_CLOEXEC选项

关于open函数O_CLOEXEC模式,fcntl函数FD_CLOEXEC选项,总结为如下几点: 1.调用open函数O_CLOEXEC模式打开的文件描述符在执行exec调用新程序中关闭,且为原子操...
  • gettogetto
  • gettogetto
  • 2016年08月20日 21:31
  • 358

文件描述符的FD_CLOEXEC标志

close_on_exec 是一个进程所有文件描述符(文件句柄)的位图标志,每个比特位代表一个打开的文件描述符,用于确定在调用系统调用execve()时需要关闭的文件句柄(参见include/fcnt...
  • hittata
  • hittata
  • 2013年03月12日 22:24
  • 1758

使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

通过fcntl设置FD_CLOEXEC标志有什么用?    close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述...
  • hunanchenxingyu
  • hunanchenxingyu
  • 2014年05月07日 01:08
  • 3528

fcntl设置FD_CLOEXEC

原文地址:http://hi.baidu.com/passerryan/item/d81eac1671ce3d5cf0090e2b 这是fcntl的一个Flag标志。 fcnt...
  • cuixingbing
  • cuixingbing
  • 2014年01月22日 16:24
  • 761

使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题! fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程...
  • ChrisNiu1984
  • ChrisNiu1984
  • 2011年12月09日 10:23
  • 15060

open函数中O_CLOEXEC标志的开关

Linux中,文件描述符有一个属性:CLOEXEC,即当调用exec()函数成功后,文件描述符会自动关闭。在以往的内核版本(2.6.23以前)中,需要调用 fcntl(fd, F_SETFD, FD_...
  • hiawui
  • hiawui
  • 2011年02月27日 15:00
  • 8238

在socket创建的时候使用SOCK_CLOEXEC设置close-on-exec

查看手册man socket   NAME socket - create an endpoint for communication SYNOPSIS #i...
  • zahuopuboss
  • zahuopuboss
  • 2013年07月21日 21:28
  • 5196

关于linux进程间的close-on-exec机制

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) 前几天写了一篇博客,讲述了端口占用情况的查看和解决。 关于linux系统端口查看和占用的解决方案 大部分这...
  • ycg514230
  • ycg514230
  • 2014年12月02日 16:42
  • 3452
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fcntl设置FD_CLOEXEC标志作用
举报原因:
原因补充:

(最多只允许输入30个字)