mount() 和jffs2_gcd_mtd0垃圾回收器
mount() and jffs2_gcd_mtd0 garbage collector
我正在开发一个运行MontaVista Linux 3.1的平台。
我有一个C++应用程序,出于深奥的原因,我不会深入,必须在只读和读写之间定期重新挂载 JFFS2 闪存文件系统。
当您执行 sys/mount.h
中指定的int mount(...)
调用以设置文件系统读写时,jffs2_gcd_mtd0
垃圾回收器进程将按预期启动。但是,当您重复mount
调用以返回到只读时,jffs2_gcd_mtd0
会被杀死,并成为一个失效的进程。
几分钟后,我们最终会得到大量已失效的jffs2_gcd_mtd0
流程,无论我们做什么,我们都无法摆脱这些流程。
我可以使用以下测试应用程序复制该问题:
int main()
{
while(true)
{
mount("/dev/mtdblock/0", "flash", "", MS_REMOUNT|MS_POSIXACL|MS_ACTIVE|MS_NOUSER|0XEC0000, "");
sleep(1);
mount("/dev/mtdblock/0", "flash", "", MS_RDONLY|MS_REMOUNT|MS_POSIXACL|MS_ACTIVE|MS_NOUSER|0XEC0000, "");
sleep(1);
}
}
我已经尝试了各种方法来收获已失效的进程:设置signal(SIGCHLD, SIG_IGN)
(不起作用);在设置为只读后调用wait(int)
(失败,errno变为10 - "无子进程"); 调用kill(0, SIGCHLD)
(不起作用)。
我假设这是我们mount
实现中的一个错误是否正确?鉴于这是一个错误,如何删除已失效的进程,并阻止进程 ID 表填满?
一些补充信息:当我使用 strace
运行测试应用程序时,似乎不会出现此问题。现在我真的被难住了!
作为一种解决方法,我发现从pthread
中调用 mount()
命令可以收获已失效的jffs2_gcd_mtd0
进程。
我相信这是通过以下机制工作的:当线程加入时,生成的jffs2_gcd_mtd0
进程没有父进程。因此它被init
继承,然后在完成后收获。
如果有人想纠正/扩展我上面的解释,请这样做!
相关文章:
- 查找 GCD:并非所有控制路径都返回值
- 为什么 std::gcd/lcm 返回 std::common_type_t<M, N> 而不是 auto?
- 这是 std::gcd 中的错误吗?
- 在 C++ 中查找 2 个数字的 GCD
- 两个二项式系数模 10^9 + 7 的 GCD
- 如何使用while循环找到GCD?模数运算符是如何工作的
- LCM 和 GCD 无法正常工作
- 在某些条件下最大化 GCD
- 最大化双分区的 GCD(最大公约数)之和?
- 数字混淆的GCD
- NTRUEncrypt:使用开源标准算法中的描述无法正确找到两个多项式的GCD,无法定义是否存在多边形的逆
- 一个数组可以划分的最大子数组,使得不同子数组中任意两个元素的 GCD 始终为 1?
- 尝试计算C 中的GCD
- GCD如果为正数和负数
- XDispatch Visual Studio GCD
- 二进制 GCD - 算法太慢
- GCD 算法不正确
- 如何找到 a,b<N 对的数量,使得 GCD(a,b) = x?
- GCD程序如何正确计算结果
- 使用欧几里得算法找到GCF(GCD)