バックグラウンド
私はCで共有ライブラリを作成しており、動的にリンクされています。これは、、、、などのLD_PRELOAD
プリロードされたアプリケーションからのネットワーク呼び出しをインターセプトしてオーバーライドすることを目的としています。socket()
connect()
recv()
send()
ライブラリの初期化で、。を使用してスレッドを起動しますpthread_create()
。このスレッドは、ユーザースペースにマップされているカーネルメモリをポーリングします。
ライブラリは、 netperf、iperf、sockperfなどのネットワーキングベンチマークアプリケーションを処理するのに十分な汎用性を備えていますが、これらに限定されません。
私の問題
すべてがうまく機能し、1つを除いてほとんどの場合人生は甘いです。デーモン化されたアプリケーション。たとえば、netserver ( netperfベンチマークアプリケーションのサーバー側)をデーモンとして、つまり-D
パラメーターなしで起動した場合、アプリケーションが最初に行うことの1つはを呼び出すことfork()
です。フォークでは、親はを使用exit(EXIT_SUCCESS)
して閉じられ、子は接続をリッスンします。親が終了するという事実は私のポーリングスレッドを殺します。
ですから、私が達成したいのは、親がいなくなった場合に、子に新しいポーリングスレッドを生成させることです。通話を傍受して無効にすることはできますfork()
が、基本的に、親が行ったかどうかを子供に知らせるにはどうすればよいですか?ライブラリは汎用でなければならないので、私は何の仮定もできません。
ありがとう。