【问题标题】:How to restrict child thread or a child process to restrict from forking in C如何限制子线程或子进程以限制 C 中的分叉
【发布时间】:2014-04-29 04:32:03
【问题描述】:

在 C 语言中,我有一个子线程(使用 pthreads), 有什么办法可以限制这个孩子,让我们不能在这个线程里面调用fork?

如果我们在里面写fork,程序不应该编译。

我也可以有一个子进程而不是子线程,只要它不能进一步分叉。

基本上我怎样才能有一个子进程或子线程,它不能再分叉一个进程。

【问题讨论】:

  • 您是编写代码的人。为什么你不能...不调用fork() 并且不让它产生其他进程?
  • 看起来是 XY 问题。
  • 您要解决的主要问题是要避免意外编写分叉炸弹吗?
  • 是的...我试图避免分叉爆炸问题。为了避免这个问题,我在 fork 上编写了一个包装器,如果调用它将返回 -1。因此它现在不能分叉。

标签: c pthreads fork parent-child


【解决方案1】:

你可以随时尝试用pthread_atfork玩游戏:http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_atfork.html

基本上,您可以使用pthread_atfork() 安装始终调用exit() 的“子”回调。这样,您的线程可能仍会分叉,但分叉的进程将立即退出,因此不会造成任何损害(并且只会产生最小的开销)。

对于流程,它可能会稍微复杂一些。 Linux 允许您限制每个用户的进程数(使用setrlimit() 设置时称为 RLIMIT_NPROC)。当达到此限制时,对于给定的用户 ID,将无法再进行分叉。因此,您可以创建一个具有CAP_SETUID 能力和一个虚拟用户的父进程,将RLIMIT_NPROC 设置为 1。这样,您可以从父进程派生,将子 uid 更改为您的“受限”用户'已经提前创建并删除了CAP_SETUID 功能。此时,child 将没有可能的方法来 fork 自己。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多