3

Linuxのclone機能をLD_PRELOADしようとしています。私の LD_PRELOADed バージョンでは、元のclone関数を呼び出す前に入力パラメーターをログに記録する必要があります。ただし、問題はclone可変数の引数を取ることです。このように宣言されています。

int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...
/* pid_t *pid, struct user_desc *tls, pid_t *ctid */ );

これらの引数を元のclone関数に渡すには、渡された引数の数を知る必要があります。どうすればよいでしょうか?

4

4 に答える 4

2

関数を使用しva_*ます。これらは、可変引数リストを操作するときに使用する方法です。

これはマニュアルページで、最後に例も含まれています。

于 2012-06-25T15:27:47.120 に答える
1

NULL ターミネータがある場合は、返さva_argない間に呼び出すことができますNULL

于 2012-06-25T15:33:11.413 に答える
1

これに対する正解は、可変引数関数の引数の数を数えることはできません。

ただし、clone関数の場合、特定のフラグには特定の追加の引数が必要なため、引数を調べることで引数の数を推測できます。flags

CLONE_PARENT_SETTIDフラグを例にとると、マニュアルページには次のように記載されています。

子スレッド ID を親および子メモリー内の位置ptidに保管します。(Linux 2.5.32-2.5.48 では、これを行うフラグ CLONE_SETTID がありました。)

したがって、このフラグが設定されている場合、ptid引数が存在する必要があることがわかり、va_*関数を使用してそれを取得できます。

ただし、ユーザーが実際に引数を渡したかどうかを確認する方法はありません。つまり、ユーザーが引数を渡さなかった場合、何かがひどく間違った方向に進む可能性があります。

于 2012-06-26T04:57:27.890 に答える
0

マニュアルページでは、次のようなプロトタイプについて説明しています。

int clone(int (*fn)(void *), void *child_stack, int flags,
          void *arg, ... /* pid_t *ptid, struct user_desc *tls, pid_t *" ctid ");

注:との間にコンマを追加しました。マニュアルページにタイプミスがあるtlspid_t思います。

ptid次に、引数とについて説明しますctid。だから私は先に進んでドキュメントをチェックします、そしてそれらの余分な引数が定義されている場合、それはそれらを読み上げる方法va_listです。

于 2012-06-25T15:40:11.137 に答える