`

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_GETFDF_SETFDF_GETFL F_SETFL
  3. arg :可选,主要根据第二个命令来决定是否需要

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

 

.函数功能:

  • 第二个参数是F_DUPFD ,则进行复制文件描述符的操作。它需要用到第三个参数arg ,这时arg 是一个文件描述符,fcntl(fdF_DUPFDarg)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_RDONLYO_WRONLYO_APPEND 等),它不需要第三个参数。实际上上这时 函数返回的是file 结构中的flags 域。
  • 第二个参数是F_SETFL ,则用来对open 系统调用第二个参数设置的标志进行改变,但是它只能对O_APPENDO_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);
}

分享到:
评论

相关推荐

    fcntl使用.doc

    其中,cmd 参数的值为 F_GETFD,可以获取与文件描述符 fd 联合的 close-on-exec 标志;cmd 参数的值为 F_SETFD,可以设置 close-on-exec 标志。 3. 获取和设置文件状态标记 fcntl 函数可以用来获取和设置文件状态...

    LR函数经验分享

    lr_set_debug_message(LR_MSG_CLASS_EXTENDED_LOG | LR_MSG_CLASS_PARAMETERS | LR_MSG_CLASS_RESULT_DATA | LR_MSG_CLASS_FULL_TRACE, LR_SWITCH_ON); // 设置一个开始日志输出的标志 lr_debug_message(LR_MSG_...

    linux fcntl()函数

    // 设置文件描述符的 close-on-exec 标志 fcntl(fd, F_SETFD, flags | FD_CLOEXEC); ``` ##### 3. 获取和设置文件状态标志 - `F_GETFL`, `F_SETFL` 命令 `F_GETFL` 和 `F_SETFL` 用于获取和设置文件的状态标志,...

    重定向和管道、信号1

    - `exec()`系列函数执行新程序时,如果文件描述符设置了`close-on-exec`标志,该文件会被自动关闭。 4. 系统文件表(SFT)和活动i节点表: - 系统文件表记录了所有打开的文件,每个文件对应一个`file`结构。 - ...

    fcntl的调用

    2. **设置和获取close-on-exec标志 (FD_CLOEXEC)**: `F_GETFD`用来查询文件描述词的`FD_CLOEXEC`标志,而`F_SETFD`则可以设置这个标志。如果`FD_CLOEXEC`为1,那么在调用`execve`时,该文件描述词会被自动关闭,防止...

    Linux设备驱动程式学习(4)-高级字符驱动程式操作[文].pdf

    例如,FIOCLEX和FIONCLEX用于设置或清除close-on-exec标志,FIONBIO则与非阻塞I/O操作相关。 在编写设备驱动时,理解并正确使用ioctl和llseek对于实现高效、安全的设备控制至关重要。它们提供了与硬件交互的灵活性...

    linux test

    但是,它们不共享“close-on-exec”标志,意味着在执行exec系列函数时,新文件描述符不会自动关闭。`dup()`成功时返回新的文件描述符,失败则返回-1。 `dup2()`与`dup()`类似,但允许指定目标文件描述符`newfd`。它...

    Linux0.11 进程子系统

    unsigned long close_on_exec; // 执行时关闭文件句柄位图 struct file *filp[NR_OPEN]; // 打开的文件 /* ldt for this task 0-zero 1-cs 2-ds&ss */ struct desc_struct ldt[3]; // 本任务的局部描述符表 /...

    使用VC++及ADO进行数据库编程

    CString strSQL = "SELECT l.CERT_ID, r.name, r.dept, l.PROP_NO, l.NORM_RET_DATE FROM lend_list AS l INNER JOIN reader AS r ON l.CERT_ID = r.CERT_ID WHERE l.NORM_RET_DATE ;"; rec.ExecSQL(strSQL); // ...

    Linux进程文件1

    表中的每一项代表一个文件描述符,记录了与文件交互的相关信息,如文件描述符的控制标志(如close-on-exec,用于决定是否在执行exec系列系统调用时关闭文件描述符)以及指向系统级打开文件表的指针。文件描述符的...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    if(my1.exec()==QDialog::Accepted) //利用Accepted 信号判 断enterBtn 是否被按下 { w.show(); //如果被按下,显示主窗口 return a.exec(); //程序一直执行,直到主窗口 关闭 } else return 0; //如果没被按下,则...

    简要对比C语言中的dup()函数和dup2()函数

    但是,它们并不共享"close-on-exec"标志,也就是说,当一个描述符在exec系列函数执行时被设置为关闭,另一个不会受到影响。 `dup()`函数的成功返回值是最小且未使用的文件描述符,失败则返回-1,并设置`errno`为...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    那些从HTML中分离出来的标志也表示语句的结束。 注释 PHP支持C,C++和Unix风格的注释方式: /* C,C++风格多行注释 */ // C++风格单行注释 # Unix风格单行注释 Hello,World! 通过我们已经学过的知识,你可以编写...

    freemarker总结

    注释标志 这里是注释 --&gt; 旧版本的freemarker采用的是&lt;#comment&gt; 注释 方法 sequences内置方法 sequence?first 返回sequence的第一个值;前提条件sequence不能是null sequence?last 返回sequence最后一个值 ...

    cmd操作命令和linux命令大全收集

    tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exec:server.exe 登陆后,将“IP”的server.exe下载到目标主机c:server.exe 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送...

    koodoo参考手册.

    ##### 3.2 执行一个SQL命令: DbExec(iHd,sCmd) - **功能**:通过已建立的连接执行SQL命令。 - **参数**:`iHd` - 连接句柄;`sCmd` - SQL命令。 - **应用场景**:执行增删改查等数据库操作。 ##### 3.3 得到总记录...

Global site tag (gtag.js) - Google Analytics