Linux-close_on_exec标志位

close_on_exec是一个进程所有文件描述符的标记位图,每个比特位代表一个打开的文件描述符,用于确定在调用系统调用execve()时需要关闭的文件句柄 (参见include/fcntl.h)。

当一个程序使用fork()函数创建了一个子进程时,往往会在该子进程中调用execve()函数加载执行另一个新程序,此时子进程将完全被新程序替换掉,并在子进程中开始执行新程序。同时子进程会拷贝父进程的文件描述符表,这样父子进程就有可能同时操作同一打开文件,如果不想子进程操作该文件描述符,则可将close_on_exec中的对应比特位被设置为1,那么在执行execve()时该描述符将被关闭,否则该描述符将始终处于打开状态。当打开一个文件时,默认情况下文件句柄在子进程中也处于打开状态。设置相应标志位则需要fcntl系统调用,其使用介绍如下:

fcntl 系统调用

这个系统调用功能比较多,可以执行多种操作,其内核函数在fs/fcntl.c 中定义:

#include <fcntl.h >
     int fcntl(int
 fildes , int cmd , ...);

man http://pubs.opengroup.org/onlinepubs/009695399/functions/fcntl.html

一 .参数:

  1. fd :欲访问 文件的文件描述符
  2. cmd :要执行的操作的命令,这个参数定义了10 个标志,下面介绍其中的5 个F_DUPFD 、F_GETFD、F_SETFD 、F_GETFL 和 F_SETFL
  3. arg :可选,主要根据第二个命令来决定是否需要

二 .返回值:根据第二个参数的不同,这个返回值也不一样。

三 .函数功能:

  • 第二个参数是F_DUPFD ,则进行复制文件描述符的操作。它需要用到第三个参数arg ,这时arg 是一个文件描述符,fcntl(fd ,F_DUPFD ,arg) 在files_struct 结构中从指定的arg 开始搜索空闲的文件描述符,找到第一个后,将fd 的内容复制进来,然后将新找到的文件描述符返回。
  • 第二个参数是F_GETFD ,则返回files_struct 结构中close_on_exec 的值。无需第三个参数。
  • 第二个参数是F_SETFD ,则需要第三个参数,若arg 最低位为1 ,则对close_on_exec 置位,否则清除close_on_exec 。
  • 第二个参数是F_GETFL ,则用来读取open 系统调用第二个参数设置的标志,即文件的打开方式(O_RDONLY ,O_WRONLY ,O_APPEND 等),它不需要第三个参数。实际上上这时 函数返回的是file 结构中的flags 域。
  • 第二个参数是F_SETFL ,则用来对open 系统调用第二个参数设置的标志进行改变,但是它只能对O_APPEND 和O_NONBLOCK 标志进行改变,这时需要第三个参数arg ,用来确定如何改变。函数返回0 表示操作成功,否则返回-1 ,并置一个错误码

示例代码:

#include <fcntl.h>
#define PATTERN	FD_CLOEXEC

/* close_on_exec - set/clear close-on-exec flag */

int     close_on_exec(int fd, int on)
{
    int     flags;

    if ((flags = fcntl(fd, F_GETFD, 0)) < 0) {
	printf("fcntl: get flags: %d", flags);
        return -1;
    }
    if (fcntl(fd, F_SETFD, on ? flags | PATTERN : flags & ~PATTERN) < 0) {
	printf("fcntl: set close-on-exec flag %s: %d", on ? "on" : "off", flags);
        return -1;
    }
    return ((flags & PATTERN) != 0);
}

原文地址:https://www.cnblogs.com/ptfe/p/11060551.html

时间: 2024-10-08 00:16:29

Linux-close_on_exec标志位的相关文章

[apue] 一个查看当前终端标志位设置的小工具

话不多说,先看运行效果: >./term input flag 0x00000500 BRKINT not in ICRNL IGNBRK not in IGNCR not in IGNPAR not in IMAXBEL not in INLCR not in INPCK not in ISTRIP not in IUCLC not in IXANY not in IXOFF not in IXON PARMRK not in output flag 0x00000005 BSDLY not

标志位介绍

一.运算结果标志位 1.进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位.如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0. 使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等. 2.奇偶标志PF(Parity Flag) 奇偶标志PF用于反映运算结果中“1”的个数的奇偶性.如果“1”的个数为偶数,则PF的值为1,否则其值为0. 利用PF可进行奇偶校验检查,或产生奇

TCP协议中的标志位

TCP/IP协议通常放在一起来说,但是它们是两个不同的协议,所起的作用也不一样. IP协议是用来查找地址的,对应于网际互联层. TCP协议是用来规范传输规则的,对应着传输层. IP协议只负责找到地址,具体传输的工作交给TCP来完成. TCP在传输之前会进行三次沟通,一般称为“三握手”:传输数据断开的时候需要进行四次沟通,一般称为“四挥手”. 要理解这个过程首先需要理解TCP中的两个序号和三个标志位的含义: seq:sequence number的缩写,表示所传数据的序号.TCP传输时每一个字节都

汇编--常用汇编指令与标志位关系

加法指令 ADD (addition) 指令对标志位的影响: CF=1   最高有效位向高位有进位 CF=0   最高有效位向高位无进位 OF=1   两个同符号数相加(正数+正数 或 负数+负数),结果符号与其相反. OF=0   两个不同符号数相加,或同符号数相加,结果符号与其相同. 带进位加法指令 ADC (add with carry) 指令对标志位的影响: CF=1   最高有效位向高位有进位 CF=0   最低有效位相高位无进位 OF=1   两个同符号数相加,结果符号与其相反, O

3.汇编中的标志位

这周主要学习的是转移指令的相关知识和原理. offset在和汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址. jmp是无条件转移指令,可以只修改IP,也可以同时修改CS和IP. CPU在执行jmp指令的时候不需要转移的目的地址,机器码中包含的的是转移的位移. Ret指令用栈中的数据,修改IP的内容,从而实现近转移. Ret=POP  IP Retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. Retf=POP IP     POP CS   CPU执行call指令时,进

汇编 影响标志位的运算

今天翘了毛概课,在宿舍里盖着小毛毯做汇编作业,遇到一个题目是给出一组指令,问每一步指令完成后,标志位是什么 什么运算会改变标志位呢?在网上查了查 (1)加法指令:ADD.ADC.INC.XADD除了INC不影响CF标志位外,都影响条件标志位. CF.ZF.SF.OF CF最高位是否有进位 DF若两个操作数符号相同而结果符号与之相反OF=1,否则OF=0. (2)减法指令:SUB.SBB.DEC.NEG.CMP.CMPXCHG.CMPXCHG8B 前六种除了DEC不影响CF标志外都影响标志位.CM

【转】 如何查看linux版本 如何查看LINUX是多少位

原文网址:http://blog.csdn.net/hongweigg/article/details/7192471 一.如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: 1) [[email protected] ~]# cat /proc/version Linux version 2.6.9-22.ELsmp ([email protected]) (gcc version 3.4.4 20050721 (Red Hat 3.4.4-

各种标志位的含义

一.运算结果标志位 1.进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位.如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0. 使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等. 2.奇偶标志PF(Parity Flag) 奇偶标志PF用于反映运算结果中"1"的个数的奇偶性.如果"1"的个数为偶数,则PF的值为1,否则其值为0. 利用P

从点击Button到弹出一个MessageBox, 背后发生了什么(每个UI线程都有一个ThreadInfo结构, 里面包含4个队列和一些标志位)

思考一个最简单的程序行为:我们的Dialog上有一个Button, 当用户用鼠标点击这个Button时, 我们弹出一个MessageBox. 这个看似简单的行为, 谁能说清楚它是如何运行起来的,背后究竟发生了什么? 下面是我个人尝试的解答: (1)我们的鼠标点击事件到达设备的驱动程序, 驱动程序把消息放入系统硬件输入队列SHIQ(system hardware input queue). (2)通过系统的原始输入线程 RIT (raw input thread)把鼠标事件发送到对应的窗口.这里我