2

我如何知道两个不同上下文中进程的“执行环境”的区别?

为了正确表达这个问题,我安装了plan9port /opt/plan9/,当我从中运行财富程序时,/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 来查看有什么区别。

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 读取财富文件。它必须与 exec 环境有关,二进制文件从中读取库。

4

1 回答 1

4

当您调用 时execve(),您正在显式设置NULL环境。所以fortune程序很可能是依赖一些环境变量来查找/opt/plan9/...。在 shell 提示符下键入env以找出设置了哪些环境变量。

于 2012-11-10T07:47:40.750 回答