转自 http://blog.csdn.net/ustc_dylan/article/details/6930189

通过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(nListenId, F_SETFD, FD_CLOEXEC) 的作用相关推荐

  1. fcntl设置FD_CLOEXEC

    原文地址:http://hi.baidu.com/passerryan/item/d81eac1671ce3d5cf0090e2b 这是fcntl的一个Flag标志. fcntl(fd, F_SETF ...

  2. Linux fcntl 函数详解

    接口 #include <fcntl.h>int fcntl(int fd, int cmd, ...); 返回值: 正确返回值根据命令码而定,错误返回-1. fcntl是用来修改已经打开 ...

  3. android的init过程分析

    2019独角兽企业重金招聘Python工程师标准>>> 前言 Android系统是运作在linux kernal上的,因此它的启动过程也遵循linux的启动过程,当linux内核启动 ...

  4. Android Framework------之Property子系统

    概述 Property是Android系统中一个重要的概念,在Android系统内,主要用于系统配置,以及不同服务间的简单信息分享.比如设备名字,蓝牙名字,编译信息,网络dns地址,以及其他的一些基本 ...

  5. 一个docker镜像中的目录删除不了问题

    在一个容器中,删除一个目录,失败: bash-4.2# pwd /home/zxcdn/ottcache/tomcat bash-4.2# uname -a Linux 3516b6c97679 3. ...

  6. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...

  7. execv shell_exec系列函数(execl,execlp,execle,execv,execvp)使用

    4,带 e 的exec函数:execle表示,将环境变量传递给需要替换的进程 从上述的函数原型中我们发现:extern char **environ; 此处的environ是一个指针数组,它当中的每一 ...

  8. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(1)

    在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路中,介绍了在Android系统中Binder进程间通信机 ...

  9. [深入理解Android卷二 全文-第四章]深入理解PackageManagerService

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第 ...

最新文章

  1. linux下练习 c++ 关联式容器multimap特性
  2. 谁说发 paper 一定要追快打新?2021年,研究 word2vec 也能中顶会!
  3. 打开python环境_windows下切换Python运行环境。
  4. 借助 Flink 与 Pulsar,BIGO 打造实时消息处理系统
  5. 【复】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
  6. 二.英语语法 - 并列句
  7. 快解析外网如何访问内网共享服务器
  8. OPENWRT 修改串口(ttyS*)笔记
  9. 通过exif.js简单处理手机照片拍摄图片旋转问题
  10. CSDN验证不了手机
  11. ubanutu 安装php,腾讯的这个JS幻灯太难扣了,求高人指点。。。_html/css_WEB-ITnose
  12. 码农学技术————六个月学习python全栈【Day08】
  13. 结绳编程【布局】重点
  14. java 垃圾收集器_JVM垃圾收集器详解
  15. 谷歌亚马逊或遭英国监管;昔日“大数据第一股”面临退市;特斯拉辅助驾驶系统索赔案胜诉丨每日大事件...
  16. 基于Python电影院售票系统设计与实现 开题报告
  17. 网优谷|C++ 语言好学吗?
  18. 照片秒变卡通风!教你用PaddleGAN快速生成你的专属卡通头像
  19. 移动通信考前预习_第4章_全球移动系统(GSM)
  20. 解决跨域问题:has been blocked by CORS

热门文章

  1. wdcp 如何创建用IP就可以访问的默认站点/修改默认站点
  2. 60个非常实用的CSS代码
  3. 哈工大2020春软件构造实验二实验报告
  4. Gradle接入checkstyle代码风格检查插件
  5. Android之电话拦截
  6. 网易云课堂Nodejs笔记(js Function,css,写法)
  7. 校招面试中常见的算法题整理【长文】
  8. (软考)系统分析师——多媒体基础知识
  9. 西南大学计算机科学与技术中外合作办学,西南大学计算机科学与技术专业中外合作办学项目2019年联合管理委员会会议召开...
  10. 面试官常问的 web前端 问题(四)