我可以不使用fork来执行Shell或系统调用吗?

罗林格

我有一个TCP服务器应用程序,偶尔需要通过关闭绑定端口然后在以后打开它们来重新配置绑定端口。

该应用程序还需要执行与其通信的外部二进制文件。当前,这是使用popen()调用完成的。外部二进制运行时间可以跨越需要​​重新配置网络端口的时间。

问题是,当主应用程序关闭端口时,它由popen创建的用于运行二进制文件的“派生”进程接管。

这是有道理的(在tcp服务器在执行接受之前绑定和分叉时发生什么?哪个进程将处理客户端请求?中对此进行了讨论,但这是不希望的,因为主应用程序随后无法重新打开端口。

是否可以在这里使用popen(3)中可用的FD_CLOEXEC O_CLOEXEC?应用程序需要popen(3)提供的管道作为执行的二进制文件的stdin,是在CLOEXEC关闭其他文件时保持打开的文件句柄。

有没有更好的方法来运行二进制文件,而不会导致分支进程保留在封闭端口上?

不继承句柄的情况下如何派生进程还有另一个可能相关的问题

巴西勒·斯塔林凯维奇

不,你不能启动其他程序,并从中取回无叉(2)其次是一些的execve(2)代码(这是什么popenposix_spawnsystem正在做的)。你会更好地避免popensystem与代码pipe+ fork+execve明确自己(因为你知道哪些文件描述符应保持并以接近(2) 一般后fork和之前的execve子进程......),看到这个

+一些热插拔功能外,每个进程和程序/sbin/init都以fork+开头execve;并且您的外壳对于大多数命令(诸如内置命令除外始终使用fork+ execvecd

所述叉(2)呼叫可以通过实现克隆(2)

阅读一些不错的书,例如在此处免费在线获取Advanced Linux Programming另请参见syscalls(2)使用(至少用于调试和了解事物)strace(1)和调试器()。研究源代码在你的自由软件的libc(GNU libc中MUSL-libc的),和你的shell的源代码。gdbpopensystem

你可以几乎模仿的execve(2)通过一个棘手的序列的mmap(2) 及相关的munmap)电话,但并不完全(在近距离上的exec等..特别WRT)。您可能还需要调用过时的setcontext(3)(或编写等效的汇编代码)。

您可能考虑与执行类似fork的类似外壳程序的专用服务器程序通信execve有关示例和灵感,请参阅我的execicar.c)。也许您会发现daemon(3)有用。

更好的选择可能是在您的应用程序中嵌入一​​些解​​释器(例如luaguile)和/或dlopen(3)一些插件缺点是(解释的脚本或插件中的)错误会影响整个服务器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以不使用fork来执行Shell或系统调用吗?

来自分类Dev

我可以在JavaScript中仅调用基本构造函数而不使用原型来模拟继承吗?

来自分类Dev

我可以报告不使用的系统错误吗?

来自分类Dev

我可以不使用“ this”来重写Javascript吗?

来自分类Dev

我可以不使用.each()来呈现此集合吗?

来自分类Dev

我可以在android中使用Linux系统调用吗?

来自分类Dev

Debian PXE预置:我可以克隆现有的Debian系统而不使用Internet吗?

来自分类Dev

我可以不使用if语句中的break来做到这一点吗?

来自分类Dev

您可以使用私有API来挂接iOS中的系统函数调用吗?

来自分类Dev

我可以使用 openmp 或 pthreads 调用不同线程的相同系统调用吗

来自分类Dev

我可以使用Google云端硬盘来管理帐户系统吗?

来自分类Dev

我可以使用ulimit来防止系统过热和重新引导吗?

来自分类Dev

我可以绕过 TypeError 来执行我的命令吗?

来自分类Dev

您可以从OSX终端执行系统调用吗?

来自分类Dev

Shell:是否可以不使用sleep来延迟命令?

来自分类Dev

我可以使用哪些编码或设计模式来执行所需的方法调用序列?

来自分类Dev

如果我只加密我的主目录,有人可以使用 USB 来入侵我的系统吗

来自分类Dev

我可以使用C ++的[strftime]来执行Java的SimpleDateFormat吗?

来自分类Dev

我可以使用Java来执行“寻求1 + 2!+ 3!+ ... + 20!并且”吗?

来自分类Dev

您可以不使用Deferred来编写此代码吗?

来自分类Dev

可以不使用save()来创建createRecord()吗?

来自分类Dev

我可以自动执行文件系统清理吗?

来自分类Dev

我可以通过不使用数据存储区而仅使用搜索持久性来摆脱困境吗?

来自分类Dev

我可以使用类助手来调用静态私有类方法吗?

来自分类Dev

我可以使用属性名称来调用设置器吗?

来自分类Dev

我可以在Robot框架中使用变量来调用关键字吗

来自分类Dev

我可以使用类助手来调用静态私有类方法吗?

来自分类Dev

我可以使用泛型来调用其构造函数吗?

来自分类Dev

我可以更改根路径来执行cron任务吗?

Related 相关文章

  1. 1

    我可以不使用fork来执行Shell或系统调用吗?

  2. 2

    我可以在JavaScript中仅调用基本构造函数而不使用原型来模拟继承吗?

  3. 3

    我可以报告不使用的系统错误吗?

  4. 4

    我可以不使用“ this”来重写Javascript吗?

  5. 5

    我可以不使用.each()来呈现此集合吗?

  6. 6

    我可以在android中使用Linux系统调用吗?

  7. 7

    Debian PXE预置:我可以克隆现有的Debian系统而不使用Internet吗?

  8. 8

    我可以不使用if语句中的break来做到这一点吗?

  9. 9

    您可以使用私有API来挂接iOS中的系统函数调用吗?

  10. 10

    我可以使用 openmp 或 pthreads 调用不同线程的相同系统调用吗

  11. 11

    我可以使用Google云端硬盘来管理帐户系统吗?

  12. 12

    我可以使用ulimit来防止系统过热和重新引导吗?

  13. 13

    我可以绕过 TypeError 来执行我的命令吗?

  14. 14

    您可以从OSX终端执行系统调用吗?

  15. 15

    Shell:是否可以不使用sleep来延迟命令?

  16. 16

    我可以使用哪些编码或设计模式来执行所需的方法调用序列?

  17. 17

    如果我只加密我的主目录,有人可以使用 USB 来入侵我的系统吗

  18. 18

    我可以使用C ++的[strftime]来执行Java的SimpleDateFormat吗?

  19. 19

    我可以使用Java来执行“寻求1 + 2!+ 3!+ ... + 20!并且”吗?

  20. 20

    您可以不使用Deferred来编写此代码吗?

  21. 21

    可以不使用save()来创建createRecord()吗?

  22. 22

    我可以自动执行文件系统清理吗?

  23. 23

    我可以通过不使用数据存储区而仅使用搜索持久性来摆脱困境吗?

  24. 24

    我可以使用类助手来调用静态私有类方法吗?

  25. 25

    我可以使用属性名称来调用设置器吗?

  26. 26

    我可以在Robot框架中使用变量来调用关键字吗

  27. 27

    我可以使用类助手来调用静态私有类方法吗?

  28. 28

    我可以使用泛型来调用其构造函数吗?

  29. 29

    我可以更改根路径来执行cron任务吗?

热门标签

归档