mount()和jffs2_gcd_mtd0垃圾收集器

时间:2013-02-01 16:12:19

标签: c++ linux mount sigchld jffs2

我正在运行一个运行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运行测试应用时,似乎不会出现此问题。现在我真的很难过!

1 个答案:

答案 0 :(得分:3)

作为一种解决方法,我发现在mount()内调用pthread命令可以获取已失效的jffs2_gcd_mtd0进程。

我相信这是通过以下机制起作用的:当线程加入时,生成的jffs2_gcd_mtd0进程没有父进程。它因此被init继承,然后在完成后获得。

如果有人想纠正/扩展我上面的解释,请做!