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 に答える