Android NDKでfork, execは使ってはダメ

Android NDKでfork, execのシステムコールは使ってはダメという話。

Google グループ

NDKの中でforkとexecを使って子プロセスを起動してデーモン的なプログラムを動かした。しばらくうまく動いていたけど、突然SEGVで落ちて、クラッシュダンプもログに出てないので原因がわからない。なんで? という質問。

fork, execはNDKのヘッダファイルに含まれているけど、それらはシステム用であり、アプリケーションから使ったときの振る舞いは保障できない。将来それを保障することもない。(さらに言えば、ある日fork, execをアプリケーションから使用することを禁止するかも。)

バックグランドで長期間動くプログラムはandroid.app.Serviceを使うのが正しい方法。


今までのAndroidの内部構造に関する知識でこれを補足すると、

Androidのアプリケーションは全てZygoteプロセスからforkされて動いていて、そのライフサイクルは管理されている。
execを呼ぶと環境変数以外のプロセス内の情報はリセットされてしまう。その結果、システム側の管理との間に不整合が生じる。
クラッシュダンプはbionicのダイナミックリンカによってdebuggerdとのつなぐ部分のハンドラが登録されているので、execしたプログラムが同じことをしないとクラッシュダンプは機能しない。