编写进程_控制台应用程序和windows应用程序

编写进程_控制台应用程序和windows应用程序我的相关博文: 系统编程-进程-exec系列函数超级详解(带各种实操代码) 一般我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈等。 此时保存文件描述符的变量当然也不存在了,我们就无法关闭无用的文件描述符了。 所以通常的做法是,我们一般会fork子进程后,先在子进程

编写进程_控制台应用程序和windows应用程序"

我的相关博文:

系统编程-进程-exec系列函数超级详解(带各种实操代码)

 

一般我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈等。

此时保存文件描述符的变量当然也不存在了,我们就无法关闭无用的文件描述符了。

所以通常的做法是,我们一般会fork子进程后,先在子进程中close那些由于继承得到的,对子进程后续工作无用的文件描述符,再去执行exec装载运行新的程序。

但是在复杂系统中,有时我们fork子进程时已经不知道打开了多少个文件描述符(包括socket句柄等),这此时进行逐一清理确实有很大难度。

我们期望的是能在fork子进程前打开某个文件描述符时就指定好:“这个描述符,我在fork子进程后执行exec时就希望将其关闭”。

其实是有这样的方法解决方案的:即所谓 的 close-on-exec。

以socket为例,我们在父进程中,创建socket的时候,只要加上SOCK_CLOEXEC标志,这样就能够达到我们期望的效果:在fork子进程中执行exec的时候,子进程会自动关闭继承得到的socket。

其他的文件描述符也有类似的功能,例如文件,可以在打开的时候使用O_CLOEXEC标识(linux 2.6.23才开始支持此标记),达到和上面一样的效果。

或者使用系统的fcntl函数设置FD_CLOEXEC也可。

//方案A
int fd     = open(“foo.txt”, O_RDONLY); int flags  = fcntl(fd, F_GETFD); flags |= FD_CLOEXEC; fcntl(fd, F_SETFD, flags); //方案B,linux 2.6.23后支持
int fd     = open(“foo.txt”,   O_RDONLY | O_CLOEXEC);

 

 

 

 

.

今天的文章编写进程_控制台应用程序和windows应用程序分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/49247.html

(0)
编程小号编程小号
上一篇 2023-09-03 11:11
下一篇 2023-09-03 11:30

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注