我正在运行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
. 现在我真的被难住了!