Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编辑RLIMIT_NPROC值的更好方法是什么_C_Linux_Limits_Linux Capabilities_Setrlimit - Fatal编程技术网

编辑RLIMIT_NPROC值的更好方法是什么

编辑RLIMIT_NPROC值的更好方法是什么,c,linux,limits,linux-capabilities,setrlimit,C,Linux,Limits,Linux Capabilities,Setrlimit,我的应用程序创建每个连接线程。应用程序在非零用户id下崩溃,有时线程数超过默认值1024。我想编辑这个号码,所以我没有多少选择 以root身份运行[非常糟糕的主意,而且必须与securty妥协,所以放弃它] 在弱势用户使用下运行设置CAP,并提供能力CAP\u系统资源。然后我可以在我的程序中添加代码 struct rlimit rlp; /* will initilize this later with values of nprocs(maximum number of desir

我的应用程序创建每个连接线程。应用程序在非零用户id下崩溃,有时线程数超过默认值1024。我想编辑这个号码,所以我没有多少选择

以root身份运行[非常糟糕的主意,而且必须与securty妥协,所以放弃它]

在弱势用户使用下运行设置CAP,并提供能力CAP\u系统资源。然后我可以在我的程序中添加代码

      struct rlimit rlp; /* will initilize this later with values of nprocs(maximum number of desired threads)*/
      setrlimit(RLIMIT_NPROC, &rlp);
      /*RLIMIT_NPROC
      *The maximum number of processes (or, more precisely on Linux, threads) that can      
      * created for the real user ID of the
      *calling process.  Upon encountering this limit, fork(2) fails with the error
      *EAGAIN. */
另一件事是编辑/etc/securitylimits.conf,在这里我可以为开发用户创建条目,并可以放置行,例如

            @devuser        hard    nproc           20000
            @devuser        soft    nproc           10000
这里10k就足够了。所以,我不太愿意改变源代码,我应该继续最后一个选项。我更想知道什么是更稳健和标准的方法

征求您的意见,并提前感谢:)


PS:如果单个进程的线程数超过1k,会发生什么情况。当然,我也有32GB的Ram。首先,我相信你有将近一千个线程是错误的。线程是相当昂贵的,而且拥有这么多线程通常是不合理的。我建议最多有几十个线程(除非你在一台非常昂贵的超级计算机上运行)

你可以在多路复用系统调用中使用一些,比如。然后,单个线程可以处理数千个连接。阅读有关和的信息。考虑使用一些类似或类似的事件库…

您可以以root用户身份启动应用程序(可能通过使用技术),设置所需的资源(特别是打开特权TCP/IP端口),并使用


你也可以用一个小小的setuid C程序来包装你的应用程序,它增加了使用限制,用
setreuid
更改用户,最后更改你的真实程序。

谢谢@Basile,实际上当前的设计是这样的,在下一版本中我们将对其进行更改。但在那之前我们想让它继续运行。。是的,没有在超级计算机上运行,但它有足够的资源。setuid然后setruid是一个很好的选择。但由于目前不愿意更改代码,我编辑了/etc/security/limit.conf文件。。