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
。今、私は本当に困惑しています!