[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
質問
この2日間で
execlp()
のシステムコールを使っているのですが、まだここにいます。さっそくですが、問題です。
は
man page
のexeclpはシステムコールを次のように宣言しています。
int execlp(const char *file, const char *arg, ...);
を記述してください。
execl(), execlp(), execle() 関数の const char arg とそれに続く省略記号は arg0, arg1, ..., argn と考えることができる。
それなのに、教科書にはこんな風にシステムコールが呼び出されているのを見かけます。
execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...);
("..." は学生である私たちが考えることです)。しかし、このシステムコールは
man page
のシステムコールの
超困惑しています。どんな助けでも感謝します。
どのように解決するのですか?
このプロトタイプは
int execlp(const char *file, const char *arg, ...);
execlp ìは可変引数関数であると書いてあります。それは2つの
const char *
. 残りの引数は、もしあれば、実行したいプログラムに渡すための追加引数である - も。
char *
- これらはすべてCの文字列です(最後の引数はNULLポインタでなければなりません)
そのため
file
引数は実行される実行ファイルのパス名です。
arg
として表示させたい文字列です。
argv[0]
を実行ファイルに追加します。規約では
argv[0]
は単なる実行ファイルの名前であり、通常、これは
file
.
は
...
が実行ファイルに与える追加引数になっています。
これをコマンドライン/シェルから実行するとします。
$ ls
それは
execlp("ls", "ls", (char *)NULL);
または、以下のように実行すると
$ ls -l /
それは
execlp("ls", "ls", "-l", "/", (char *)NULL);
で、次に
execlp("/bin/sh", ..., "ls -l /bin/??", ...);
ここでは、シェル、/bin/sh に移動して、シェルに実行するコマンドを与えています。このコマンドは "ls -l /bin/??"です。コマンドライン/シェルから手動で実行することができます。
$ ls -l /bin/??
さて、シェルを起動してコマンドを実行させるにはどうしたらいいのでしょうか?シェルのドキュメント/マニュアルページを開き、それを読むのです。
実行したいのは
$ /bin/sh -c "ls -l /bin/??"
これは次のようになります。
execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);
余談ですが
この
/bin/??
はパターンマッチングを行っています。このパターンマッチングはシェルによって行われ、/bin/以下のすべてのファイルを2文字で展開します。もし、単純に
execlp("ls","ls", "-l", "/bin/??", (char *)NULL);
おそらく何も起こらないだろう(実際にその名前のファイルがなければ)。
/bin/??
を解釈して展開するシェルは存在しないので、/bin/?
関連
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] ワイルドカードマッチングに基づいて、現在のフォルダとサブフォルダ内のすべてのファイルを再帰的に検索するにはどうすればよいですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] Linux で grep を使ってファイル名だけを表示するにはどうしたらいいですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】警告:引数「互換性のないポインタ型から」を渡す[デフォルトで有効]。
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み] テスト