我正在运行一个运行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)
(不起作用);在set设置为只读后调用wait(int)
(失败,errno为10 - “No child processes”);调用kill(0, SIGCHLD)
(不起作用)。
我认为这是我们所拥有的mount
实施中的错误吗?鉴于这是一个错误,我怎么能删除已解散的进程,并停止进程ID表填满?
一些补充信息:当我使用strace
运行测试应用时,似乎不会出现此问题。现在我真的很难过!
答案 0 :(得分:3)
作为一种解决方法,我发现在mount()
内调用pthread
命令可以获取已失效的jffs2_gcd_mtd0
进程。
我相信这是通过以下机制起作用的:当线程加入时,生成的jffs2_gcd_mtd0
进程没有父进程。它因此被init
继承,然后在完成后获得。
如果有人想纠正/扩展我上面的解释,请做!