実行中のすべてのプロセスのコマンドライン引数を取得しようとしています。これらのプロセスの中には、/ proc/$ {pid}/cmdlineの4096文字制限を超えるコマンド行があるため、そのprocfsファイルを読むことが私の要求を満たしていません。興味のあるプロセスは一時的なものかもしれないので、私は自分のpidを知るとすぐに/ proc/$ {pid}/memのスタックからコマンドライン引数を読むことができる必要があります。これは私のCコードでptraceを使ってそれらに接続する必要があります。死んだpidでptrace(PTRACE_DETATCH、pid、NULL、NULL)が呼び出されるとどうなりますか?
while (pid >= 0){
intPtraceReturnValue = ptrace(PTRACE_ATTACH,pid,NULL,NULL);
if(intPtraceReturnValue != -1){
wait(&intStatus);
readFromProcMem(pid); // function that handles /proc/${pid}/mem reading
intPtraceReturnValue = ptrace(PTRACE_CONT,pid,NULL,NULL);
wait(&intStatus);
intPtraceReturnValue = ptrace(PTRACE_DETATCH,pid,NULL,NULL);
printFoundCommandLineArgs(); // prints results.
}
pid = getNextPid(); // function that interrogates /proc for the next running pid.
}
時々PTRACE_ATTACH呼び出しが-1を返します。これは通常、パイプが呼び出されたときに発生し、この場合はptraceを呼び出すまでにコマンドライン引数が履歴に失われていると受け入れることができます。しかし、他のケースでは、ptraceが正常に接続されますが、PTRACE_CONTを呼び出してカーネルミューテックスが解放されるのを待っている間にプロセスが終了するので、私はデタッチできません。つまり、PTRACE_DETATCHの呼び出しは、intStatusがPTRACE_CONTの呼び出しによって0に設定されている場合は-1を返します。これを実行して数分後、私はpidに関連する記憶を見ることができません。時々、/ procのリストへの私のアクセスは拒否されるようです。他のケースでは、空の結果が得られます。私はptrace添付ファイルのテーブルがあり、ptraceが死んだpidでPTRACE_DETACHで呼び出されているため、十分にクリアされていないと考えられます。これは本当ですか?もしそうなら、手作業で添付ファイルをクリアするにはどうすればいいですか?もしそうでなければ、ptraceは/ procへのアクセスを妨害するでしょうか?私は、プログラムの他の要約された部分がptraceが関与していないときに個別に作業することを確認しました。私はこれがptraceのやや正統的ではないことを知っています。任意の考えは、あなたが複数の問題を持っている
ちなみに私はgcc 4.4.7(要件ごと)を使用していますが、Lunixカーネル2.6.32-696.3.2.el6.x86_64 – thurmanukyalur