fcntl的close-on-exec标志

2024-02-13 07:18
文章标签 exec close 标志 fcntl

本文主要是介绍fcntl的close-on-exec标志,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每个文件描述符都有一个close-on-exec标志。默认情况下,这个标志最后一位被设置为 0。这个标志符的具体作用在于当开辟其他进程调用exec()族函数时,在调用exec函数之前为exec族函数释放对应的文件描述符。


我们来看一下具体的实例。这是两个程序:

view plain copy to clipboard print ?
  1. //file:fcntl
  2. int main()
  3. {
  4. pid_t pid;
  5. fd = open("test.txt",O_RDWR|O_APPEND);
  6. if (fd == -1)
  7. ##printf("open err/n");
  8. printf("fd = %d",fd);
  9. printf("fork!/n");
  10. fcntl(fd, F_SETFD, 1);
  11. char *s="ooooooooooooooooooo";
  12. pid = fork();
  13. if(pid == 0)
  14. execl("ass", "./ass", &fd, NULL);
  15. wait(NULL);
  16. write(fd,s,strlen(s));
  17. close(fd);
  18. return 0;
  19. }
  20. //ass 源代码
  21. int main(int argc, char *argv[])
  22. {
  23. int fd;
  24. printf("argc = %d ",argc);
  25. fd = *argv[1];
  26. printf("fd = %d",fd);
  27. char *s = "zzzzzzzzzzzzzzzzzzz";
  28. write(fd, (void *)s, strlen(s));
  29. close(fd);
  30. return 0;
  31. }

PS:那个test.txt提前已经创建 为空文件~

fcntl(fd, F_SETFD, 1) 此句将fd的close-on-exec 标志设置为1,开启此标志。那么当子进程调用execl函数时,execl执行ass,ass是不能向fd内写入的,因为在调用execl函数之前系统已经讲子进程的此文件描述符关闭了。(attention:这里是子进程!)
但是如果将 fcntl(fd, F_SETFD, 1)改为fcntl(fd, F_SETFD, 0),或者直接将此句注释掉,那么,ass便可以向这个文件描述符中任意添写东西了~~

PS:如果将fcntl设置为开启,即设置为1,那么,此文件描述符依然是可以被主进程操作的。

下面将程序执行的结过给大家:
当执行此句fcntl(fd, F_SETFD, 1)
fd = 3fork!
argc = 2 fd = 3
test.txt中的内容为:
ooooooooooooooooooo

当将fcntl(fd, F_SETFD, 1)注释掉或者将 1改为 0时
结果:
fd = 3fork!
argc = 2 fd = 3lost
test.txt中的内容为:
zzzzzzzzzzzzzzzzzzoooooooooooooooooooooo

 

这篇关于fcntl的close-on-exec标志的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704851

相关文章

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

一次生产环境大量CLOSE_WAIT导致服务无法访问的定位过程

1.症状 生产环境的一个服务突然无法访问,服务的交互过程如下所示: 所有的请求都是通过网关进入,之后分发到后端服务。 现在的情况是用户服务无法访问商旅服务,网关有大量java.net.SocketTimeoutException: Read timed out报错日志,商旅服务也不断有日志打印,大多是回调和定时任务日志,所以故障点在网关和商旅服务,大概率是商旅服务无法访问导致网关超时。 后

Linux函数fcntl/system学习

本文针对项目中用到的几个函数进行详细分析,并尽可能的添加示例进行验证学习。比如fcntl/ioctl函数、system/exec函数、popen/pclose函数、mmap函数等。 重点参考了《UNP》和《Linux程序设计》第四版。 一、fcntl函数 fcntl函数可以改变或者查看已打开文件的性质。该函数的定义如下: #include <fcntl.h> int fcntl(

COCO Kepoints 标志位

COCO 数据集中annotations字段keypoints是一个长度为3*k的数组,其中k是category中keypoints的总数量。每一个keypoint是一个长度为3的数组,第一和第二个元素分别是x和y坐标值,第三个元素是个标志位v,v为0时表示这个关键点没有标注(这种情况下x=y=v=0),v为1时表示这个关键点标注了但是不可见(被遮挡了),v为2时表示这个关键点标注了同时也可见

Linux下的exec函数簇

目录 一、引言 二、exec函数簇简介 三、exec函数簇用法详解    1.execl    2.execlp    3.execle    4.execv    5.execvp    6.execvpe 四、exec函数簇原理剖析 五、实际应用场景 六、总结         本文将详细介绍Linux环境下exec函数簇的原理、用法及实际应用场

delphi : 窗体的close,free,destroy的区别

一、我用application.create(TForm2,Form2)语句,创建了Form2,可是调用了Form2.close后,重新调用Form2.show. 刚才所创建的Form2仍然存在。问为了节约资源,应该怎样使用close,free,destroy. 三者的关系是什么? 1、Action:=caFree。 2、 with TForm1.Create(Application) do

初次用用Spring 和mybatis整合的报出Manual close is not allowed over a Spring managed SqlSession错误

一般这种错误是由于没有删dao实现类中的close,因为框架已经帮你写好了

java 利用Runtime.getRuntime().exec()代码调用服务器执行命令

Process exec= Runtime.getRuntime().exec(command,null,newFile("/")); String result =StringUtils.trim(InputStreamUtils.getContentsAsString(exec.getInputStream(),"utf8"));//接收执行结果 注释:command是想要执行

深入解析 Docker exec 命令

目录 Docker exec 命令详解 常用选项 示例 注意  Docker 容器允许你在隔离的环境中运行应用程序,这样可以确保应用运行所需的环境是一致的,无论是在开发、测试还是生产环境中。当需要在 Docker 容器中执行命令时,通常会用到 docker exec 命令。下面是对 docker exec 命令的详细解释以及其工作原理的概述。 Docker exec

【codeforces】293E. Close Vertices 点分治+树状数组

传送门:【codeforces】293E. Close Vertices 题目分析:找一棵树上有多少条路径长度不超过l且边权和不超过w的路径。 我们用点分治处理。 分治每一层,对每一个重心,预处理出到重心距离d,边权和为w的所有路径。将路径按照w排序,然后我们用双指针扫描数组,同时维护一个树状数组,树状数组中保存的是到重心距离为d的条数。因为有贡献可能来自子树,于是我们对子树进行同样的