了解流程的执行环境

时间:2012-11-10 07:45:02

标签: c process exec strace

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

为了正确地表达问题,我在/opt/plan9/中安装了plan9port,当我从/opt/plan9/bin/fortune运行财富计划时,它运行正常。 (从/opt/plan9/lib/fortune/opt/plan9/lib/fortune.index读取财富列表。当我使用

从c代码(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 +++

给出默认消息“Misfortune”。

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

1 个答案:

答案 0 :(得分:4)

当您致电execve()时,您明确设置了NULL个环境。因此,fortune程序可能依赖于某个环境变量来查找/opt/plan9/...。在shell提示符下键入env以找出设置的环境变量。