2

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

4

1 回答 1

3

作为一种解决方法,我发现mount()从 a 中调用该命令pthread可以让已失效的jffs2_gcd_mtd0进程被回收。

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

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

于 2013-02-05T14:44:34.903 回答