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 功能描述:根据文件描述词来操作文件的特性...

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

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

关于fd的close on exec(非常重要)

子进程socket继承问题 发表于10 九月, 2013由zhoutall 昨天实习的时候遇到这样一个问题,抽象起来如下: 有一个进程A,它是一个全局监控进程,监控进程B。 进程B是一...

eventfd函数

eventfd 在内核版本,2.6.22以后有效。查看内核版本可以用命令 uname -r 。 [cpp] view plaincopyprint? ...

Linux进程/线程协作之eventfd

eventfd是linux的一个系统调用,为事件通知创建文件描述符。 eventfd()创建一个“eventfd对象”,这个对象能被用户空间应用用作一个事件等待/响应机制,靠内核去响应用户空间应用事...
  • gx_1983
  • gx_1983
  • 2017年04月17日 18:25
  • 182

Nginx源码分析 - 主流程篇 - 多进程实现

默认情况下,Nginx都是多进程的运行模式。Nginx和Memcached不一样,是多进程的模式。采用多进程模式最大的好处:1. 每个进程的资源独立2. 不需要添加各种繁琐的锁了Nginx多进程实现的...
  • initphp
  • initphp
  • 2016年08月21日 09:15
  • 1620

union 类型 内存对齐

如下代码结果为什么是24? union DATE { char a; int i[5]; double b; }; DATE max; cout...

fcntl设置FD_CLOEXEC标志作用

通过fcntl设置FD_CLOEXEC标志有什么用? close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,...

fcntl的FD_CLOEXEC标志位与exec族

CLOEXEC:close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子...

fcntl设置FD_CLOEXEC && fcntl(文件描述符操作)

这是fcntl的一个Flag标志。 fcntl(fd, F_SETFD, FD_CLOEXEC); // 这里设置为FD_CLOEXEC表示当程序执行exec函数时本fd将被系统自动关闭,表示不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fcntl设置FD_CLOEXEC标志作用
举报原因:
原因补充:

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