当前位置: 首页 > 面试题库 >

从C中的系统命令启动的进程继承父fd

郭瀚海
2023-03-14
问题内容

我有一个SIP服务器的示例应用程序,它同时侦听tcp和udp端口5060。在代码中的某个点上,我执行一个系统(“ pppd文件/ etc / ppp /
myoptions&”);

在这之后,如果我执行netstat -apn,则显示端口5060也已为pppd打开!有什么方法可以避免这种情况?Linux中系统功能的这种标准行为吗?

谢谢,艾莉森


问题答案:

是的,默认情况下,每当您派生一个进程时(system子进程确实这样做),子级继承所有父级的文件描述符。如果孩子不需要这些描述符,则应该关闭它们。使用此方法system(或执行fork
+
exec的任何其他方法)来执行此操作的方法是,在进程的子进程不应该使用的所有文件描述符上设置FD_CLOEXEC标志。每当任何孩子执行其他程序时,这将导致它们自动关闭。

通常,程序在任何时间都会打开任何种类的文件描述符,该文件描述符将存在很长一段时间(例如您的示例中的侦听套接字),并且不应与子进程共享,您应该这样做

fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);

在文件描述符上。

截至2016年?修订版POSIX.1,可以SOCK_CLOEXEC在创建套接字时使用标志或套接字的类型来自动获得此行为:

listenfd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, 0);
bind(listenfd, ...
listen(listemfd, ...

即使其他同时运行的线程执行了a systemfork+ exec调用,它也会被正确关闭。幸运的是,Linux和BSD
UNIX(不幸的是,不支持OSX)已经对该标志提供了一段时间的支持。



 类似资料:
  • 13.2.1 继承父启动器 要配置您的项目继承spring-boot-starter-parent只需设置parent: <!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-par

  • 问题内容: 我知道在DOS / Windows应用程序中,您可以使用以下代码行从系统发出系统命令: 要么 …来自stdlib.h。是否有类似的Linux命令,如果可以,我可以在哪个头文件中找到它? 另外,这被认为是不好的编程习惯吗?我正在考虑尝试使用该命令获取已加载的内核模块的列表。这是个好主意还是坏主意?我发现一些网站似乎对系统调用(至少是system(“ pause”);)持负面看法。 问题答

  • 问题内容: 我该如何继承其父代的样式和javascript。 我努力了 但是,它会删除标签。此外,我看不到影响iframe的样式。 我是否有更好/其他的方法来解决这个问题?谢谢。 问题答案: 您可以通过在iframe中使用以下代码来“继承”父级的CSS: 在IE,Chrome和Firefox中对我来说效果很好。 关于JavaScript,我找不到直接将父JavaScript添加到iframe中的方

  • 在我的父pom xml文件中,我声明了一些在大多数孩子的pom中使用的依赖项。 然而,在一个子pom中,我不使用这些依赖项,我想找到一种方法来排除它们(为了不被视为未使用的依赖项)。 现在,在子pom的依赖部分,我什么都没有!有什么想法吗?

  • 问题内容: 如果我通过Java的ProcessBuilder类启动流程,则可以完全访问该流程的标准输入,标准输出和标准错误流(如Java 和)。不过,我不能找到一种方法,这些流无缝连接,和。 可以用来获取包含子流程的标准输出和标准错误的单个文件,然后循环遍历并通过我的标准输出将其发送出去,但是我找不到一种方法可以让用户输入到流程中,如果我使用C 调用,他或她可以。 Java SE 7发行时似乎有可

  • 我有一个问题,我正试图利用我以前的编程知识来编写一个地雷发射器。我使用了标准C库中的命令和任何规模不大的Python代码。我更喜欢使用系统(“java…”) 以发射雷艇。 简而言之,问题是:如何在没有任何辅助Java代码的情况下从命令行启动Minecraft?(如果不使用像net.minecraft.LauncherFrame这样的发射器代码)这有可能吗?我尝试了java-cp采矿工艺。罐子网。地