【问题标题】:mount() and jffs2_gcd_mtd0 garbage collectormount() 和 jffs2_gcd_mtd0 垃圾收集器
【发布时间】:2013-01-17 00:13:11
【问题描述】:

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

【问题讨论】:

  • 听起来像是 jffs2 代码中的错误。我想知道在 mount() 调用之前执行 umount() 是否有助于避免它?
  • strace 会减慢速度,因此它可能是 jffs2 文件系统驱动程序代码中的竞争条件。尝试从github.com/torvalds/linux/tree/master/fs/jffs2 编译最新的 jffs2 驱动程序。您在dmesg 输出的日志中看到任何错误吗?
  • 感谢 cmets 伙计们。不幸的是,首先调用umount() 恐怕并没有什么不同,而dmesg 也没有显示任何有用的输出。我想我找到了一种解决方法,我将在下面概述,所以我认为我可以忍受这个错误。但是如果我仍然有问题,那么我会尝试重新编译 jffs2 驱动程序。
  • 你有什么理由不在 jffs2 邮件列表的内核上发布这个问题?

标签: c++ linux mount sigchld jffs2


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 2015-03-14
    • 2018-12-30
    • 1970-01-01
    • 2011-01-06
    • 2015-07-10
    • 2010-12-23
    • 2015-11-26
    相关资源
    最近更新 更多