gpt4 book ai didi

c++ - 如何在大型 Linux 应用程序中以编程方式设置 "yank the network cable"?

转载 作者:IT王子 更新时间:2023-10-29 01:05:58 24 4
gpt4 key购买 nike

我在 Linux 上有一个大型 C++ 应用程序,其中构建并链接了许多第一方和第三方库。

应用程序的某些部分应该在不访问文件系统或网络的情况下执行(特别是加载网络文件)。我们定期发现此操作确实加载文件,通常是由于程序员错误。

我如何在代码中强制执行此操作?例如:

try {
lockFileSystem();
Application->DoImportantOperation();
unlockFileSystem();
} catch ( InvalidFileSystemAccess )
{
// bad programmer, no pizza
}

或者是否存在某种较低级别的回调,应用可以在文件打开时 Hook ?

请注意,我知道 strace 的强大之处,但它已经到了需要将其作为应用程序执行的一部分强制执行的地步,而不是作为事后手动测试。

最佳答案

这取决于代码合法地试图做什么,但您可以使用 setrlimit()RLIMIT_NOFILE 来做到这一点。

像这样的东西应该可以工作:

#include <sys/resource.h>

struct scoped_fd_blocker {
rlim_t prev;
scoped_fd_blocker() {
rlimit lim;
getrlimit(RLIMIT_NOFILE, &lim); // get the current limit
prev = lim.rlim_cur; // save old limit
lim.rlim_cur = 0; // set the soft limit to 0
setrlimit(RLIMIT_NOFILE, &lim); // do the set
}

~scoped_fd_blocker() {
rlimit lim;
getrlimit(RLIMIT_NOFILE, &lim); // get the current limit
lim.rlim_cur = prev; // reset the soft limit to the previous value
setrlimit(RLIMIT_NOFILE, &lim); // do the set
}
};


// Example Usage:
void do_stuff() {
scoped_fd_blocker blocker;
Application->DoImportantOperation();
}

基本上这通过将进程的软打开文件描述符限制置零来告诉操作系统不要让您的进程打开任何文件描述符,即使现有文件描述符已关闭。请注意,这不仅仅是文件,可能会产生一些意想不到的后果。这将包括文件、套接字、事件对象、目录、共享资源、管道,并且还会阻止 C 库打开文件。 (一些 C 库确实使用文件锁和其他东西来管理并发。)想想所有打开文件的东西(例如 dlopen)。

任何打开文件描述符的尝试都将失败(返回 -1),并且 errno 将被设置为 EMFILE,即“错误 24:打开的文件过多”。

我已将整个内容放在一个结构中,因此它具有很强的异常安全性。

关于c++ - 如何在大型 Linux 应用程序中以编程方式设置 "yank the network cable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9285921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com