2012-11-10 37 views
1

如何知道两个不同环境中进程的“执行环境”的差异?了解进程的执行环境

为了正确表达问题,我在/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 +++ 

给出了默认消息 “不幸”。

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

+2

虽然这看起来没有引起你的问题,但你没有正确调用execve(),因为在第二个参数('opts')中传递的数组必须以'NULL'结尾。 –

回答

4

当您拨打execve()时,您明确设置了NULL环境。所以fortune程序可能取决于一些环境变量来找到/opt/plan9/...。在shell提示符下键入env以找出设置了哪些环境变量。

+0

相关的env变量是PLAN9,它被设置为/ opt/plan9。我应该在调用execve()时通过它吗? – swair

+0

是的,这听起来不错。不要忘记用'NULL'项来终止你的环境变量数组。 –

+0

确定一个更多的查询。当我生成zsh时,它会调用fortune binary,并且无法读取正确的/ opt/plan9/lib/fortunes文件,它会每次输出Misfortune。我如何让zsh像test.c一样工作?我必须设置什么样的环境变量?任何想法? – swair