- 浏览: 44744 次
- 来自: 杭州
文章分类
最新评论
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
一 .参数:
- fd :欲访问 文件的文件描述符
- cmd :要执行的操作的命令,这个参数定义了10 个标志,下面介绍其中的5 个F_DUPFD 、F_GETFD 、F_SETFD 、F_GETFL 和 F_SETFL
- 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); }
发表评论
-
fedora系统删除多余内核
2013-01-22 21:32 1764查看本地系统安装的内核版本: $rpm -q ... -
Ubuntu change GNOME to XFCE problem
2012-12-14 16:10 852I'm now experiencing this probl ... -
c库中snprintf返回值误区
2012-11-07 22:05 7477最近看开源代码中发现一个问题,下面是发表在内核开 ... -
C++著名类库
2012-11-03 20:00 798转自 http://www.open-open ... -
Signal信号
2012-10-07 12:55 01) SIGHUP 本信号在用户终端连接(正常或非正常)结 ... -
Nginx
2012-09-20 23:38 0nginx (pronounced "engine ... -
Linux 灾难恢复
2012-09-19 21:57 0简介: Linux 发行版本 ... -
Linux进程地址空间的探究解析
2012-08-08 23:35 0我们知道,在32位机器上 linux操作系统中的进程的地址空 ... -
git使用
2012-08-08 23:23 0我认为每个学过Git的人都应该做过类似这种笔记,因为Git命令 ... -
select, poll和epoll的区别
2012-07-31 21:34 0随着2.6内核对epoll的完全支持,网络上很多的文章和 ... -
linux多线程编程
2012-07-28 23:09 0本篇总结POSIX线程。可以用多个线程在单进程环境中执行多个任 ... -
select 和 epoll区别
2012-07-27 23:16 0最近有朋友在面试的时候被问了select 和epoll效率差的 ... -
echo显示变色
2012-07-24 17:07 0先来熟悉一下echo,如下: 名称 ... -
换行符的使用
2012-07-24 14:07 0Have you ever opened a s ... -
How to create and apply a patch with Git
2012-07-24 13:55 0Git is quite common now ... -
Facebook Folly源代码分析
2012-07-23 21:33 0Folly 是 Facebook 的一个开源C++11组件库, ... -
浅谈GCC预编译头技术
2012-07-23 09:51 921——谨以此文,悼念我 ... -
MySQL索引背后的数据结构及算法原理
2012-07-21 22:37 0转自 http://blog.jobbole.com/2400 ... -
patch文件的制作与使用
2012-07-01 18:43 2191创建补丁文件: 比如一个工程目录为project-o ... -
动态链接库版本管理
2012-06-28 20:24 0一、Linux的动态共享库版本控制实现 li ...
相关推荐
其中,cmd 参数的值为 F_GETFD,可以获取与文件描述符 fd 联合的 close-on-exec 标志;cmd 参数的值为 F_SETFD,可以设置 close-on-exec 标志。 3. 获取和设置文件状态标记 fcntl 函数可以用来获取和设置文件状态...
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_...
// 设置文件描述符的 close-on-exec 标志 fcntl(fd, F_SETFD, flags | FD_CLOEXEC); ``` ##### 3. 获取和设置文件状态标志 - `F_GETFL`, `F_SETFL` 命令 `F_GETFL` 和 `F_SETFL` 用于获取和设置文件的状态标志,...
- `exec()`系列函数执行新程序时,如果文件描述符设置了`close-on-exec`标志,该文件会被自动关闭。 4. 系统文件表(SFT)和活动i节点表: - 系统文件表记录了所有打开的文件,每个文件对应一个`file`结构。 - ...
2. **设置和获取close-on-exec标志 (FD_CLOEXEC)**: `F_GETFD`用来查询文件描述词的`FD_CLOEXEC`标志,而`F_SETFD`则可以设置这个标志。如果`FD_CLOEXEC`为1,那么在调用`execve`时,该文件描述词会被自动关闭,防止...
例如,FIOCLEX和FIONCLEX用于设置或清除close-on-exec标志,FIONBIO则与非阻塞I/O操作相关。 在编写设备驱动时,理解并正确使用ioctl和llseek对于实现高效、安全的设备控制至关重要。它们提供了与硬件交互的灵活性...
但是,它们不共享“close-on-exec”标志,意味着在执行exec系列函数时,新文件描述符不会自动关闭。`dup()`成功时返回新的文件描述符,失败则返回-1。 `dup2()`与`dup()`类似,但允许指定目标文件描述符`newfd`。它...
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]; // 本任务的局部描述符表 /...
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); // ...
表中的每一项代表一个文件描述符,记录了与文件交互的相关信息,如文件描述符的控制标志(如close-on-exec,用于决定是否在执行exec系列系统调用时关闭文件描述符)以及指向系统级打开文件表的指针。文件描述符的...
if(my1.exec()==QDialog::Accepted) //利用Accepted 信号判 断enterBtn 是否被按下 { w.show(); //如果被按下,显示主窗口 return a.exec(); //程序一直执行,直到主窗口 关闭 } else return 0; //如果没被按下,则...
但是,它们并不共享"close-on-exec"标志,也就是说,当一个描述符在exec系列函数执行时被设置为关闭,另一个不会受到影响。 `dup()`函数的成功返回值是最小且未使用的文件描述符,失败则返回-1,并设置`errno`为...
那些从HTML中分离出来的标志也表示语句的结束。 注释 PHP支持C,C++和Unix风格的注释方式: /* C,C++风格多行注释 */ // C++风格单行注释 # Unix风格单行注释 Hello,World! 通过我们已经学过的知识,你可以编写...
注释标志 这里是注释 --> 旧版本的freemarker采用的是<#comment> 注释 方法 sequences内置方法 sequence?first 返回sequence的第一个值;前提条件sequence不能是null sequence?last 返回sequence最后一个值 ...
tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exec:server.exe 登陆后,将“IP”的server.exe下载到目标主机c:server.exe 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送...
##### 3.2 执行一个SQL命令: DbExec(iHd,sCmd) - **功能**:通过已建立的连接执行SQL命令。 - **参数**:`iHd` - 连接句柄;`sCmd` - SQL命令。 - **应用场景**:执行增删改查等数据库操作。 ##### 3.3 得到总记录...