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 ファイルを変更するにはどうすればよいですか。バイナリがライブラリを読み取る場所から、実行環境と関係がある必要があります。