我想解析/proc/net/tcp/
,但是安全吗?
我应该如何打开文件/proc/
并从中读取文件,不要害怕其他一些进程(或操作系统本身)会在同一时间对其进行更改?
一般来说,没有。 (因此,这里的大多数答案都是错误的。)根据您想要的属性,它 可能
是安全的。但是,如果您过多地假设中的文件一致性,则很容易在代码中导致错误/proc
。例如,请查看此错误,该错误来自假设它/proc/mounts
是一致的快照。
例如:
/proc/uptime
有人在另一个答案中提到过,这 完全 是 原子的 -但 仅从 不到两年的 Linux 2.6.30开始 。因此,直到那时,即使这个很小的琐碎文件也一直处于竞争状态,并且仍然存在于大多数企业内核中。请参阅fs/proc/uptime.c
以获取当前源或使其变为原子的提交。在2.6.30之前的内核上,您可以open
将文件read
进行一些修改,然后read
再进行一次html" target="_blank">返回操作,则得到的文件将与第一部分不一致。(我只是演示了这一点-自己尝试一下很有趣。)
/proc/mounts
在单个read
系统调用中是 原子的 。 因此,如果read
一次全部读取整个文件,则将获得系统上安装点的单个一致快照。但是,如果您使用多个read
系统调用-如果文件很大,那么如果您使用常规I / O库并且不特别注意此问题,就会发生这种情况-您将遇到麻烦健康)状况。不仅您将无法获得一致的快照,而且在您开始之前就存在并且从未停止存在的挂载点可能会丢失。要看到它的原子的一个read()
,在看m_start()
的fs/namespace.c
,看它抢信号灯,门卫挂载点的列表,其中它保持直到m_stop()
,这就是所谓的时read()
已经完成了。要查看可能出问题的地方,(与我上面链接的错误相同)/proc/mounts
。
/proc/net/tcp
,这实际上是您要问的那个,甚至没有那么一致。它 仅在表的每一行中都是原子的 。要查看此信息,请在同一文件listening_get_next()
中net/ipv4/tcp_ipv4.c
及其established_get_next()
下方查看,并依次查看它们在每个条目上取下的锁。我没有方便的repro代码来证明行与行之间缺乏一致性,但是那里(或任何其他地方)没有锁可以使它保持一致。如果您考虑一下,这是有道理的-网络通常是系统的一个非常繁忙的部分,因此在此诊断工具中提供一致的视图是不值得的开销。
/proc/net/tcp
在每一行中保持原子状态的另一部分是缓冲seq_read()
,您可以读入fs/seq_file.c
。这样可以确保一旦您read()
将一行的一部分包含在内,整个行的文本将保留在缓冲区中,以便下一read()
行在开始新行之前将获得该行的其余部分。/proc/mounts
即使执行多次read()
调用,也使用相同的机制使每一行保持原子状态,这也是/proc/uptime
新内核中用于保持原子性的机制。这种机制也
没有 缓冲整个文件,因为内核是谨慎的内存使用。
其中的大多数文件/proc
至少与一致/proc/net/tcp
,每行在提供的任何信息中均具有一个条目的一致图片,因为它们大多数使用相同的seq_file
抽象。/proc/uptime
但是,如示例所示,某些文件直到seq_file
2009年仍在迁移使用。我敢打赌,仍有一些使用较旧的机制,甚至没有这种原子性。这些警告很少记录。对于给定的文件,您唯一的保证是阅读源代码。
对于/proc/net/tcp
,您可以阅读并解析每一行而不必担心。但是,如果您尝试一次从多行中得出任何结论,请注意,在阅读时,其他进程和内核 会
对其 进行 更改,并且很可能会产生错误。
问题内容: 在Linux(或Solaris)上,有没有比重复进行手动分析更好的方法,以弄清您是否可以读取,写入或执行存储在内存中一个或多个地址上的内容? 例如,在Windows中,您拥有。 在Linux中,我可以更改这些值,但是无法读回。 此外,除了做一些极具侵害性的事情并在进程中的所有线程上使用并拦截任何可能影响内存的尝试外,是否有其他方法可以知道这些权限何时发生更改(例如,某人使用我背后的文件
本文向大家介绍Ruby中的Proc类及Proc的类方法Proc.new的使用解析,包括了Ruby中的Proc类及Proc的类方法Proc.new的使用解析的使用技巧和注意事项,需要的朋友参考一下 Proc是对块及其context(局部变量的作用域以及栈框架)进行对象化处理之后得到的过程对象。您可以像使用无名函数那样来使用Proc,但它不会导入局部变量的作用域(可以把动态局部变量用作Proc局部变量
问题内容: 如果删除3.1G日记文件,将失败。但是,此文件占用太多空间。我怎么解决这个问题?如何删除? 问题答案: TL; DR:您有两个选择。启动MongoDB时,请使用启动选项将日记文件的大小限制为128MB,或使用该选项关闭日记功能。在生产中使用通常是个坏主意,在开发中也使用不同的写关注点通常很有意义,因此您在开发和生产中没有不同的代码。 长答案 :不,删除日志文件是不安全的。日记的想法是这
问题内容: 我的问题是,我想使用在JAVA中实现的通用解析器来解析不同类型的二进制文件。也许使用解析器读取的配置文件来描述文件格式,或者创建Java类来根据某种解析规则来解析文件。 我已经在互联网上进行了很多搜索,但是在该主题上几乎找不到任何内容。 我发现的只是与编译器生成器(Jay,Cojen等)打交道的东西,但我认为我不能用它们来生成一些用于解析二进制文件的东西。但是在这个假设上我可能是错的。
问题内容: 有谁知道一个允许我解析.PO文件的Java库?我只想创建ID和值的映射,以便将它们加载到数据库中。 问题答案: 根据Java gettext实用程序手册, 您可以使用程序将PO文件转换为ResourceBundle类,并使用java.util.ResourceBundle或gnu.gettext.GettextResource读取它- 我认为这是最有效的方法。Gettext-commo
问题内容: 我的数据是JSON文件时遇到问题。我正在使用Google的以下链接。 当我想解析数据并将其显示在屏幕上时,会发生我的问题。由于某种原因,数据未正确解码。 原始数据: 当我输入数据时,请执行以下操作: 我收到的输出是以下内容(使用org.json从json文件中提取数据)(请注意,缺少反斜杠): 我目前用于处理第一个问题的方法: 第二个虽然逃脱了我(没有双关语) 我认为这不起作用的原因是