2

2 つの異なるコンテキストでのプロセスの「実行環境」の違いを知るにはどうすればよいですか?

質問を適切に表現するために、私は plan9port をインストールして/opt/plan9/おり、そこから fortune プログラムを実行すると正常に動作し/opt/plan9/bin/fortuneます。/opt/plan9/lib/fortune(とから運勢のリストを読み取ります/opt/plan9/lib/fortune.index)。ACコード(test.c)の内部から呼び出すと

char* opts[] = {"fortune"};
execve("/opt/plan9/bin/fortune", opts, NULL);

おみくじは読まない。strace を使用して、これら 2 つのバイナリを呼び出したときの違いを確認しました。

strace -f -eopen ./test

open("/usr/local/plan9/lib/fortunes", O_RDONLY) = -1 ENOENT (No such file or directory)
Misfortune!
+++ exited with 1 +++

デフォルトのメッセージ「不幸」を出します。

strace -f -eopen fortune

open("/opt/plan9/lib/fortunes", O_RDONLY) = 3
Snob intellectual bachelors can't have fun in San Antonio.  -Ted Nelson
+++ exited with 0 +++

これは完全に正常に機能します。

./test read fortunes ファイルを変更するにはどうすればよいですか。バイナリがライブラリを読み取る場所から、実行環境と関係がある必要があります。

4

1 に答える 1

4

を呼び出すとexecve()、明示的に環境が設定されNULLます。したがって、fortuneプログラムはおそらくいくつかの環境変数に依存して検索します/opt/plan9/...。シェルプロンプトenvで入力して、設定されている環境変数を確認します。

于 2012-11-10T07:47:40.750 に答える