mount() 和jffs2_gcd_mtd0垃圾回收器

mount() and jffs2_gcd_mtd0 garbage collector

本文关键字:mtd0 gcd jffs2 mount      更新时间:2023-10-16

我正在开发一个运行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继承,然后在完成后收获。

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