5

GetCommandLineおよびCommandLineToArgvに相当するLinuxと同様の質問

Linuxで生のコマンドラインを取得することは可能ですか?ファイル/proc/ self/cmdlineは破棄されます。

./a.out files="file 1","file 2" param="2"

プリント

./a.outfiles=file 1,file 2param=2

がらくたです

コマンドラインのエスケープは、最初の引数を除くすべての引数で機能します。

./a.out files=\"fil 1\",\"fil 2\"\ param=\"2\"

プリント

./a.outfiles="fil1","fil2" param="2"
4

1 に答える 1

11

そんなことはできません。コマンドライン引数は、実際には個々の文字列として新しいプロセスに渡されます。Linux カーネル ソースを参照してください: kernel_execve

kernel_execve(...)がかかることに注意してくださいconst char *argv[]-したがって、Linuxには長い文字列のコマンドラインなどはありません-引数を個別のコンポーネントに分割する必要があるのは上のレイヤーです。

編集:実際には、システムコールはここにあります:

システムコールを除く

しかし、上記のステートメントはまだ適用されます。argv のパラメーターは、カーネルが C ライブラリー呼び出しから exec へのパラメーターを取得するまでに、すでに分割されています。

argv[] 配列を生成するのは、「プログラムのスターター」 (通常はシェルですが、シェルである必要はありません) の責任です。「グロビング」 (ワイルドカード ファイル名を一致する実際のファイルに展開する) と、引用符の削除、変数の置換などを行います。

また、C ライブラリには「exec」のバリエーションがいくつかありますが、カーネルに入る方法は 1 つしかないことも指摘しておきます。すべてのバリアントは、execve上でリンクしたシステム コールで終了します。他のバリアントは、呼び出し元が引数を個々の要素に分割することを好まない可能性があるためです。そのため、C ライブラリはプログラマーのためにそれを行うことで「支援」します。同様に、環境配列を新しいプログラムに渡す場合 - プログラマーが特定の環境を必要としない場合、親プロセスの環境変数を自動的に取得するバリアントを呼び出すだけで済みます。

于 2012-12-26T15:38:31.980 に答える