【发布时间】:2013-01-17 00:13:11
【问题描述】:
我正在开发一个运行 MontaVista Linux 3.1 的平台。
我有一个 C++ 应用程序,由于我不会深入讨论的深奥原因,它必须在只读和读写之间定期重新挂载 JFFS2 闪存文件系统。
当您执行int mount(...) 调用(在sys/mount.h 中指定)以设置文件系统读写时,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 运行测试应用程序时,似乎不会出现此问题。现在我真的很难过!
【问题讨论】:
-
听起来像是 jffs2 代码中的错误。我想知道在 mount() 调用之前执行 umount() 是否有助于避免它?
-
strace会减慢速度,因此它可能是 jffs2 文件系统驱动程序代码中的竞争条件。尝试从github.com/torvalds/linux/tree/master/fs/jffs2 编译最新的 jffs2 驱动程序。您在dmesg输出的日志中看到任何错误吗? -
感谢 cmets 伙计们。不幸的是,首先调用
umount()恐怕并没有什么不同,而dmesg也没有显示任何有用的输出。我想我找到了一种解决方法,我将在下面概述,所以我认为我可以忍受这个错误。但是如果我仍然有问题,那么我会尝试重新编译 jffs2 驱动程序。 -
你有什么理由不在 jffs2 邮件列表的内核上发布这个问题?
标签: c++ linux mount sigchld jffs2