linux posix_spawn 创建的进程没有环境变量
时间: 2023-11-22 08:56:27 浏览: 89
是的,使用 `posix_spawn` 函数族创建的进程默认是不继承父进程的环境变量的。如果需要在子进程中使用父进程的环境变量,需要手动将环境变量传递给子进程。
可以通过设置 `posix_spawnattr_t` 结构体中的 `posix_spawnattr_setsigmask()` 和 `posix_spawnattr_setflags()` 函数来将环境变量传递给子进程。具体实现可以参考下面的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <spawn.h>
#include <string.h>
#include <unistd.h>
extern char **environ;
int main() {
pid_t pid;
int ret;
char *argv[] = { "/bin/ls", "-l", NULL };
posix_spawn_file_actions_t actions;
posix_spawnattr_t attr;
// 初始化 spawnattr
posix_spawnattr_init(&attr);
// 设置 spawnattr
posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETPGROUP | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK);
// 设置环境变量
char **envp = environ;
size_t env_size = 0;
while (*envp != NULL) {
env_size += strlen(*envp) + 1;
envp++;
}
char *env_buf = malloc(env_size);
envp = environ;
char *env_buf_pos = env_buf;
while (*envp != NULL) {
size_t len = strlen(*envp) + 1;
memcpy(env_buf_pos, *envp, len);
env_buf_pos += len;
envp++;
}
posix_spawnattr_setenv(&attr, env_buf, env_size);
// 执行 spawn
ret = posix_spawn(&pid, argv[0], &actions, &attr, argv, environ);
if (ret != 0) {
printf("posix_spawn failed: %s\n", strerror(ret));
return -1;
}
printf("child pid: %d\n", pid);
free(env_buf);
return 0;
}
```
在上面的示例代码中,我们通过 `posix_spawnattr_setenv()` 函数将环境变量传递给了子进程。这里需要注意的是,需要手动计算环境变量的大小,并将其存储在一个缓冲区中,然后将缓冲区的地址和大小传递给 `posix_spawnattr_setenv()` 函数。
阅读全文