我正在开发一个运行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
继承,然后在完成后收获。
如果有人想纠正/扩展我上面的解释,请这样做!