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

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

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

try {

lockFileSystem();

Application->DoImportantOperation();

unlockFileSystem();

} catch ( InvalidFileSystemAccess )

{

// bad programmer, no pizza

}

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

注意我知道strace非常棒,但是它已经达到了需要在应用程序执行过程中强制执行的程度,而不是作为事后手动测试.

解决方法:

这取决于代码究竟是在合法地尝试做什么,但你可以用setrlimit()的RLIMIT_NOFILE来做到这一点.

这样的事情应该有效:

#include

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-2,filesystems,linux,networking

来源: https://codeday.me/bug/20190613/1234235.html

linux 大型c程序,c – 如何以编程方式在大型Linux应用程序中“拉网线”?相关推荐

  1. android 程序颜色,android – 以编程方式设置scrim颜色

    我正在尝试以编程方式设置AppBarLayout的主要颜色. XML布局是 AndroidStudio的Scrolling示例: android:fitsSystemWindows="tru ...

  2. c语言入门小程序素数,C语言编程入门经典18个小程序

    C语言是面向过程的,而C++是面向对象的 C跟C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考量的是怎样借助一个过程,对输入(或环境条件)进行运算处理得到输出(或推动 ...

  3. android自动启动某个程序,android – 如何以编程方式在xiaomi中启用应用程序的自动启动...

    适用于xiaomi,oppo,vivo和oneplus手机. try { Intent intent = new Intent(); String manufacturer = android.os. ...

  4. 用户查看订单信息php,php – 以编程方式获取用户刚刚在Ubercart中完成的订单

    警告!不要使用上面的答案.请参阅我的评论以获得解释 而不是上面提交的答案(您永远不应该使用)创建自定义Ubercart条件操作(CA)并将其添加到您的Ubercart CA工作流程中的"触发 ...

  5. Linux内核模块的概念和基本的编程方法

    Linux内核模块的概念和基本的编程方法 标签: Linux内核模块 2013-06-14 18:29 1864人阅读 评论(0) 收藏 举报 分类: linux内核(34) 版权声明:本文为博主原创 ...

  6. C#应用程序与MATLAB联合编程

    本文主要结合C#编写应用程序方便强大和MATLAB在工业科学界的广泛应用,结合两者的优点,利用C#编写的windows桌面应用程序作为UI交互接收用户配置,并根据用户在前端应用界面的操作自动控制MAT ...

  7. linux误删 bin目录,记linux下rm误删bin文件的解决方式

    平常有个坏习惯,删文件为了快点,喜欢用rm xx*,删除一些关键词文件.今天为了删/bin下几个含有mix关键词的文件,使用命令rm mix*.手贱,mix和*之间多了个空格...灾难发生了!bin下 ...

  8. 小程序的3种副业方式,合适你来可以来

    从2021年下半年开始,很多人在全力干小程序赚钱.我有几个微信里多年的好友,从去年4月份左右开始做,现在每个月利润稳定在3-5W左右. 商业利润多数尚存于广告,你讨厌的行为,正是别人赚钱的利器. 微信 ...

  9. linux应用程序接收文件,Linux应用程序学习之文件编程

    Linux应用程序学习之文件系统调用函数编程 上一篇我们了解了Linux系统下函数库的设计方法,这一章我们就来学习一下linux系统下常用的文件操作函数,在进行系统文件操作函数介绍前,我们首先要明白一 ...

  10. Linux学习笔记(3)- 网络编程以及范例程序

    Linux学习笔记(3)- 网络编程以及范例程序 前言 网络介绍 IP地址的介绍 端口和端口号的介绍 通信流程 socket介绍 TCP介绍 python3编码转换 TCP客户端程序开发流程 多任务版 ...

最新文章

  1. 360前端星学习笔记-深入CSS
  2. 每天一道LeetCode-----删除链表倒数第n个节点
  3. Java 动态代理 Demo
  4. HTTP、HTTP2、HTTPS、SPDY等的理解及在spring-boot中的使用
  5. selenium处理动态加载数据
  6. Linux屏幕取词翻译 - 思路及实现过程
  7. 完美解决异常问题UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-7: ordinal not in ra
  8. 股权转让所得个人所得税管理办法(试行)
  9. OpenCV 读写图像、读写像素、修改像素值(案例:图像反处理)
  10. POSCMS 模块发布内容
  11. 微软官方工具_微软官方英文写作在线工具,完全免费
  12. Java邮件发送QQ邮箱带附件
  13. 如何在微信内置浏览器中开启开发者模式(f12)
  14. 人工神经网络算法的应用,神经网络算法应用案例
  15. Java精品文章收藏(百度文库)
  16. 文本编辑时切换中英文输入状态
  17. 【xp无法安装.net怎么办】
  18. 求职面试经验分享,提高求职成功率
  19. 计数排序算法——C++
  20. iOS 网络环境模拟流量监控实战

热门文章

  1. nyoj 628 小媛在努力= =(水)
  2. STL map 的基本成员函数
  3. 【学习笔记】生成下一个排列(STL库函数next——permutation)
  4. ce 修改 java游戏_CE6.4.3修改器加强版 CE加强版 可过NP的和众多游戏的CE修改器 - 下载 - 搜珍网...
  5. python立方体类_python学习12类
  6. mysql查询一周内的订单_MYSQL查询一周内的数据(最近7天的) 怎么写
  7. password php,password.php
  8. java usb camera_Android usb camera设备添加
  9. activemq网页管理端使用_极周PC端(网页版)使用说明
  10. 算法:匹配有效的括号20. Valid Parentheses