Это зависит от того, что именно код пытается законно сделать, но вы могли бы сделать это с setrlimit()
s 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: слишком много открытых файлов».
Я поместил все это в структуру, чтобы она была строго исключительной.