タグ付けされた質問 「exec」

exec()ファミリーの関数は、現在のプロセスイメージを新しいプロセスイメージに置き換え、古いプロセスのpidとパイプを保持します。このタグは、現在のシェルをプログラムまたはさまざまなリダイレクト関連のものに置き換えるために使用できる組み込みシェルにも使用されます。


4
シェルでファイルを実行するとどうなりますか?
だから、私はこれをよく理解していると思ったが、テストを実行して(誰かに反対した会話に応じて)、私の理解に欠陥があることがわかりました... 可能な限り詳細に、シェルでファイルを実行すると正確に何が起こるのでしょうか?私が意味するのは、./somefile some argumentsシェルに入力somefileしてreturnキーを押すと(そしてcwdに存在し、読み取りと実行の許可がありますsomefile)、フードの下で何が起こるのですか? 私が考えた答えでした。 シェルはにsyscallを作成しexec、パスを渡しますsomefile カーネルが調べsomefileではとルックスのマジックナンバーファイルのそれは、プロセッサが処理できる形式であるかどうかを判断します ファイルがプロセッサが実行できる形式であることをマジック番号が示している場合、 新しいプロセスが作成されます(プロセステーブルのエントリを使用) somefile読み取り/メモリにマップされます。スタックが作成され、実行のコードのエントリポイントにジャンプされるsomefileと、ARGVパラメータの配列に初期化(char**、["some","arguments"]) マジック番号がある場合シェバング次いで、exec()上記のように、新しいプロセスを生成するが、実行可能な使用は、インタプリタシェバング(例えばによって参照され/bin/bash又は/bin/perl)とsomefileに渡されSTDIN ファイルに有効なマジックナンバーがない場合、「無効なファイル(不良なマジックナンバー):Execフォーマットエラー」などのエラーが発生します。 ただし、ファイルがプレーンテキストの場合、シェルはコマンドを実行しようとします(入力したかのように)と誰かに言われましたbash somefile。私はこれを信じていませんでしたが、試しただけで、それは正しかったです。ですから、ここで実際に何が起こっているのかについて誤解があり、その仕組みを理解したいと思います。 シェルでファイルを実行するとどうなりますか?(詳細は合理的です...)
32 shell  kernel  exec  shebang 


2
ラッパースクリプトのexecの理由
簡単に言えば、次のラッパースクリプトの例を見てきました。 #!/bin/bash myprog=sleep echo "This is the wrapper script, it will exec "$myprog"" exec "$myprog" "$@" 上で見たように、それらはexec、新しく作成されたシェルをほぼ即座にに置き換えるために使用し$myprogます。なしで同じことを達成できexecます: #!/bin/bash myprog=sleep echo "This is the wrapper script, it will exec "$myprog"" "$myprog" "$@" この最後の例では、新しいbashインスタンスが開始$myprogされ、bashインスタンスの子プロセスとして開始されます。 最初のアプローチの利点は何ですか?
27 bash  exec 

2
POSIXは標準ユーティリティへのパスを保証しますか?
Cから、標準ユーティリティ(psなど)を実行する最も簡単な方法は何ですか? POSIXは、たとえば、標準psが存在することを保証していますか、/bin/psまたはPATH環境変数を取得した値にリセットしてから、PATH confstr(_CS_PATH, pathbuf, n);検索でユーティリティを実行する必要がありますか?
22 path  c  posix  exec 

2
ターゲットアプリケーションのゼロ番目の引数を設定するPOSIXの方法はありますか?
でbash使用exec -aするzshことができ、代わりにARGV0特定のゼロ引数でプログラムを実行するように設定することもできますが、POSIXの方法もありますか? この1つのコメントで示唆されているように、これを達成するための(一時的な)シンボリックリンクを作成できますが、この方法では、新しいゼロ番目の引数値を真に任意の値、たとえば特定の絶対パスを持つコマンドに設定できませんでした。他の解決策はありますか?

3
シェルからアプリケーションを「正しく」起動する方法
質問を正確に表現するのは難しいと思いますが、最善を尽くします。dwmデフォルトのウィンドウマネージャーとして使用し、dmenu私のアプリケーションランチャーとして。ブラウザ以外のGUIアプリケーションはほとんど使用しません。私の作業のほとんどは、コマンドラインから直接行われます。さらに、私はオペレーティングシステム、アプリケーションなどに関するミニマリズムの大ファンです。私が取り除けなかったツールの1つは、アプリケーションランチャーでした。主に、アプリケーションランチャーの動作/動作について正確に理解していないためです。大規模なインターネット検索でも、あいまいな説明しか表示されません。私がやりたいのは、アプリケーションを実際に生成すること以外はまったく使用できないため、アプリケーションランチャーを削除することです。これを行うには、シェルからアプリケーションを「正しく」起動する方法を知りたいと思います。これにより、「正しく」の意味は「アプリケーションランチャーが行うように」に近似できます。 シェルからプロセスを生成する次の方法について知っています。 exec /path/to/Program 新しいプロセスを作成せずに、指定されたコマンドでシェルを置き換えます sh -c /path/to/Program シェル依存プロセスを起動する /path/to/Program シェル依存プロセスを起動する /path/to/Program 2>&1 & シェルに依存しないプロセスを起動する nohup /path/to/Program & シェルに依存しないプロセスを起動し、出力を nohup.out 更新1:さまざまな条件下でのdmenu繰り返し呼び出しからの再構築などを説明できps -eflます。新しいシェル/bin/bashと、このシェルの子としてアプリケーションが生成されます/path/to/Program。子供が周りにいる限り、シェルは周りにあります。(これを管理する方法は私を超えています...)対照的にnohup /path/to/Program &、シェルから発行する場合/bin/bash、プログラムはこのシェルの子になりますが、このシェルを終了すると、プログラムの親が最上位のプロセスになります。したがって、最初のプロセスがたとえば/sbin/init verbose、それがあった場合、それはPPID 1プログラムの親になります。ここで私は、グラフを使って説明しようとしたものです:chromium経て発足したdmenu、firefox使用して開始されましたexec firefox & exit。 systemd-+-acpid |-bash---chromium-+-chrome-sandbox---chromium-+-chrome-sandbox---nacl_helper | | `-chromium---5*[chromium-+-{Chrome_ChildIOT}] | | |-{Compositor}] | | |-{HTMLParserThrea}] | | |-{OptimizingCompi}] | | `-3*[{v8:SweeperThrea}]] | |-chromium | |-chromium-+-chromium …
21 shell  exec 

4
forkとexecはどのように機能しますか?
私はあまり経験がなく、ユーザーレベルからハードウェアにどのように解釈するのかプロセスに関与しようとしています。 そのため、コマンドがシェルから起動されると、そのコマンドのfork()子プロセスを継承し、子プロセスをexec()メモリにロードして実行します。 子プロセスに親プロセス(元のプロセス)のすべての属性が含まれている場合、この子プロセスの必要性は何ですか?元のプロセスもメモリにロードされている可能性があります。 これforkとexec概念は、UNIXのすべての実行可能プログラムに適用されますか?シェルスクリプトも、コマンドだけが好きですか?シェルの組み込みコマンドにも適用されますか? コマンド/スクリプトを実行する場合、コピーオンライトの概念はいつ使用されますか? 一度に多くの質問をしてすみませんが、コマンドの実行について考えると、これらすべての質問が一度に思い浮かびます。
17 fork  exec 

6
スクリプトの開始後にインタープリターを選択します(例:hashbang内のif / else)
スクリプトを実行しているインタープリターを動的に選択する方法はありますか?2つの異なるシステムで実行しているスクリプトがあり、使用したいインタープリターは2つのシステムの異なる場所にあります。最終的に私がしなければならないのは、切り替えるたびにハッシュバングの行を変更することです。私はこれと論理的に同等の何かをしたいと思います(この正確な構成は不可能であると認識しています): if running on system A: #!/path/to/python/on/systemA elif running on system B: #!/path/on/systemB #Rest of script goes here または、最初のインタープリターを使用しようとし、見つからない場合は2番目のインタープリターを使用するように、これがさらに良いでしょう。 try: #!/path/to/python/on/systemA except: #!path/on/systemB #Rest of script goes here 明らかに、私は代わりに、/path/to/python/on/systemA myscript.py または /path/on/systemB myscript.py 現在の場所に応じて実行でき ますが、実際にはを起動するラッパースクリプトがmyscript.pyあるため、手作業ではなくプログラムでpythonインタープリターへのパスを指定したいと思います。

1
exec 3 <&1は何をしますか?
exec現在のシェルでI / Oリダイレクションを実行できることは理解していますが、次のような使用方法しか見ていません。 exec 6&lt;&amp;0 # Link file descriptor #6 with stdin. # Saves stdin. exec 6&gt;&amp;1 # Link file descriptor #6 with stdout. # Saves stdout. それから、私はそれ&lt;が入力ストリーム用で&gt;あり、出力ストリーム用であることを理解しています。それではどうしexec 3&lt;&amp;1ますか? PS:Batsのソースコードからこれを見つけました

6
Linux Ubuntuでのphp shell_exec()パーミッション
Linuxサーバーを使用してphpアプリケーションを開発しています。私の問題は実行中ですshell_exec()いくつかのexeファイルを呼び出すようにしているのが機能しない(実際にはexeではなく、Linux実行可能ファイルの一種です) echo shell_exec("whoami"); デーモンを得た echo shell_exec("ls") ファイル名を取得しましたが、 echo shell_exec("php -v") 何もない、空白のページ echo shell_exec("php ....bla bla bla") 空白ページも。 terminal(user hu)で入力すると、これらすべてのコマンドが機能します。私は数時間グーグルを検索しました、人々は許可のためにそれを言います。Linuxの経験はありません。PHPでプログラムを実行するにはどうすればよいですか?
13 linux  shell  php  exec 

4
Bashのビルトインexecの使用例/実用例
Bashの組み込みexecのドキュメントからこれを考慮してください。 execは、新しいプロセスを作成せずにシェルを置き換えます ユースケース/実用例を提供してください。これが理にかなっているのかわかりません。 私はグーグルでI / Oリダイレクトについて知りました。もっと説明してもらえますか?

3
exec関数でファイル名を2回渡す必要があるのはなぜですか?
StevensによるUNIX環境での高度なプログラミングの第 8 章を読みました。6つのexec関数をすべて読んで理解しました。 私が気づくのは、すべてのexec関数で: 最初の引数はファイル名/パス名です(exec関数によって異なります)。 2番目の引数はmain()、取得するargv [0]です。これは、ファイル名自体です。 したがって、ここでは関数でファイル名を2回渡す必要があります。 それには理由がありますか(最初の引数からパス名からファイル名を取得できないなど)?


2
子プロセスが作成直後にexec()またはexit()を呼び出すときにvfork()が使用されるのはなぜですか?
オペレーティングシステムの概念とAPUEは言う vfork()を使用すると、親プロセスは一時停止され、子プロセスは親のアドレス空間を使用します。vfork()はコピーオンライトを使用しないため、子プロセスが親のアドレススペースのページを変更した場合、再開すると、変更されたページが親に表示されます。したがって、vfork()は、子プロセスが親のアドレス空間を変更しないように注意して使用する必要があります。 vfork()は、子プロセスが作成直後にexec()またはexit()を呼び出すときに使用することを目的としています。 最後の文をどのように理解できますか? vfork()呼び出しによって作成された子プロセスの場合、新しいプログラムをロードすることにより、親プロセスのアドレス空間を変更exec()しませんexec()か? vfork()呼び出しによって作成された子プロセスが、子を終了するときに親プロセスのアドレス空間を変更exit()しませ exit()んか? 私はLinuxを優先します。 ありがとう。
11 linux  process  exec  exit  vfork 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.