exec*()
Bashシェルがプログラムの起動に使用する関数系列のバリエーションを理解したいと思います。たとえば、このsystem()
関数はを使用しますが、execl()
Bashは何を使用しますか?
私はいくつかの調査をしましたが、端末で入力したコマンドを実行するためのBashソースコードの正しい場所であることを誰もが再確認したいと思いました。
Bashバージョン4.2.53を調査した結果execute_cmd.c
。
execute_disk_command()
// I think this is where bash forks a child
pid = make_child (savestring (command_line), async);
...
exit (shell_execve (command, args, export_env));
shell_execve (command, args, env)
// I think this is where the child invokes the new program
execve (command, args, env);
上記の制御フローは正しいですか?
答え1
なぜこれを知りたいのかわかりませんが:
1つのexec呼び出しだけが実際にはシステムコールです。execve()
他のすべてのexec *()関数は、execve()のフロントエンドとして機能するライブラリ関数にすぎません。 truss(1) またはレプリケーションを使用すると、以下を使用しない限り、システムコールのみが表示されます。truss -u libc::