c - 了解进程的执行环境

标签 c process exec strace

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

为了正确阐明问题,我在 /opt/plan9/ 中安装了 plan9port,当我从 /opt/plan9/bin/fortune 运行 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 读取运气文件。它必须与二进制文件从中读取库的执行环境有关。

最佳答案

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

关于c - 了解进程的执行环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13320277/

相关文章:

java - 避免调度执行器创建 java 进程的多个实例

c - 错误提示我的全局结构未初始化

c++ - 如何在 ofn.lpstrFilter 中以数字开头的文件格式名称?开头不允许写3?

linux - iftop - 如何找到这些端口相关的进程

java - 子进程继承了什么?

C - 带有嵌套 fgets 循环的 fork 和管道

c - 结构体指针的 undefined symbol

php - 如何处理 php 中的循环和运行时错误程序

windows - 在windows中创建后台进程

c - 如何使用 execlp 将命令行参数传递给 C 程序