所以我正在分叉我的程序,并再次执行相同的程序。
该程序在开始时通过 getenv("PATH"); 解析 $PATH 环境变量;但由于某种原因,子进程的 env $PATH 是空的。
char *path = getenv("PATH");
if(fork() == 0)
{
execve(path, argv, NULL);
}
else //parent
{
wait(0);
}
这不是你使用的方式execve()
。第一个参数是可执行文件的路径,而不是 PATH 环境变量。第三个参数是您为子进程指定环境的位置,当您在那里传递 NULL 时,子进程将不会继承任何环境变量(包括 PATH)。
“原因”是您为 的最后一个参数传递了一个 NULL execve
,它应该是一个以 NULL 结尾的 name=value 字符串数组,代表新进程的环境;传递 NULL 意味着孩子得到一个空的环境。
您还尝试执行扩展的 PATH 变量,这从一开始就没有什么意义。