gpt4 book ai didi

c - 如何在C中将子进程设置为与父进程相同的环境变量以使用execve?

转载 作者:行者123 更新时间:2023-11-30 17:03:15 25 4
gpt4 key购买 nike

我试图将子进程的环境设置为类似于父进程,我需要用字符串填充名为 envp 的数组,如下所示:

char *envp = malloc(sizeof(args) / sizeof(char *));
strcpy(envp[0], strcat("HOME=", getenv("HOME")));
envp[1] = strcat("PATH=", getenv("PATH"));
envp[2] = strcat("TZ=", getenv("TZ"));
envp[3] = strcat("USER=", getenv("USER"));
envp[4] = strcat("LOGNAME=", getenv("LOGNAME"));
envp[5] = 0;

里面 if(fork() ==0)

setenv("parent", cwd, 1);
if((execve(args[0], &args[0], envp)) < 0 ){
perror(*args);
exit(EXIT_FAILURE);
}

我这样做是因为我不知道这些环境变量的值,所以我想复制父变量,以便在 execve() 中使用它们来替换子进程!我使用 execve() 而不是 execvp(),因为我想在执行命令之前处理搜索 cwd 并搜索未找到 cwd 的 shell 路径名的目录。

所以我的问题是:如何以正确的方式设置数组的值?另外,我是否误解了任何概念?

我在这里看了很多帖子,但很明显我迷路了!提前致谢,

最佳答案

您没有为 envp [x] 指向的字符串分配内存。相反,您尝试将 strcatstrcpy 转换为常量或未分配的字符串,这是不允许的(您的编译器很可能已警告您)

总体概念是

  1. 您需要为环境指针数组分配内存字符串(你就是这样做的)。
  2. 您还需要为这些指针指向的每个字符串分配内存(您没有这样做)。请注意,在大多数操作系统中,内存属于进程环境的所有权,因此您不能使用局部变量,也不能释放该内存。
  3. 您需要将从 (2) 检索到的指针保存到您在 (1) 处分配的数组位置(您已这样做)

您的代码应类似于(仅以“HOME”为例,envbuff 的长度可能需要调整/检查):

char envBuff [100];

strcpy (envBuff, "HOME=");
strcat (envBuff, getenv ("HOME));
envp [0] = strdup (envBuff);

strdup实际上分配它使用的内存,strcat或者像对envp[0]那样的简单分配 code> 不要 - strcat 假设原始部分和附加部分都有足够的空间,并且内存是可写的,但在您的情况下这两者都不是真的。

关于c - 如何在C中将子进程设置为与父进程相同的环境变量以使用execve?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com