posix_spawn创建的进程工作目录为什么跟父进程一样
时间: 2023-08-08 19:13:20 浏览: 85
在使用 `posix_spawn` 函数创建一个新进程时,可以指定一个属性对象 `posix_spawnattr_t` 来控制新进程的一些属性,其中包括工作目录。如果不指定工作目录,那么新进程的工作目录就会继承自父进程。
这种继承的行为是符合 Unix 系统的惯例的。在 Unix 系统中,进程是由现有进程派生而来的,通常需要继承一些属性,例如环境变量、文件描述符等等。工作目录也是这些属性之一,因为在执行某些操作时,需要相对于某个目录来进行。
因此,如果想要让新进程的工作目录与父进程不同,需要在创建进程时显式地指定工作目录属性。可以通过 `posix_spawnattr_setcwd_np` 函数来设置工作目录属性。例如,下面的代码可以创建一个在 `/tmp` 目录下工作的新进程:
```
posix_spawnattr_t attr;
posix_spawnattr_init(&attr);
posix_spawnattr_setcwd_np(&attr, "/tmp");
pid_t pid;
char *argv[] = { "/bin/ls", "-l", NULL };
posix_spawn(&pid, "/bin/ls", NULL, &attr, argv, NULL);
posix_spawnattr_destroy(&attr);
```
相关问题
linux环境posix_spawn创建进程时更改工作目录
可以使用 `posix_spawnattr_t` 结构体中的 `posix_spawnattr_setcwd_np()` 函数来更改新进程的工作目录。该函数的第一个参数是指向 `posix_spawnattr_t` 结构体的指针,第二个参数是要设置的新工作目录的路径。
以下是一个简单的示例代码,演示如何使用 `posix_spawn()` 和 `posix_spawnattr_setcwd_np()` 函数来创建一个新进程并将其工作目录更改为指定路径:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <spawn.h>
int main() {
posix_spawnattr_t attr;
pid_t pid;
char *argv[] = {"/bin/ls", "-l", NULL};
char *path = "/tmp";
posix_spawnattr_init(&attr);
posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETPGROUP);
// 设置工作目录
posix_spawnattr_setcwd_np(&attr, path);
if (posix_spawn(&pid, argv[0], NULL, &attr, argv, environ) == 0) {
printf("Child process started with PID %d\n", pid);
waitpid(pid, NULL, 0);
} else {
perror("posix_spawn");
}
posix_spawnattr_destroy(&attr);
return 0;
}
```
在上面的示例中,我们使用 `posix_spawnattr_setcwd_np()` 函数将工作目录设置为 `/tmp`,然后使用 `posix_spawn()` 函数创建新进程并执行 `/bin/ls -l` 命令。注意,我们还使用 `posix_spawnattr_setflags()` 函数将新进程与其父进程分离,以避免在父进程中等待子进程退出。
posix_spawn创建进程时如何继承父进程的环境变量
在使用`posix_spawn`函数创建新进程时,可以通过传递一个`posix_spawnattr_t`类型的对象来指定新进程的属性。这个对象中有一个`envp`成员,它是一个字符指针数组,用于指定新进程的环境变量。如果想要继承父进程的环境变量,可以将父进程的`environ`数组作为参数传递给`posix_spawnattr_setenv`函数,然后将这个对象传递给`posix_spawn`函数。代码示例如下:
```c
#include <spawn.h>
#include <unistd.h>
extern char **environ;
int main(void) {
posix_spawnattr_t attr;
posix_spawnattr_init(&attr);
posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETPGROUP);
char *argv[] = { "/bin/ls", "-l", NULL };
pid_t pid;
int ret = posix_spawn(&pid, "/bin/ls", NULL, &attr, argv, environ);
if (ret != 0) {
perror("posix_spawn");
return -1;
}
return 0;
}
```
在这个例子中,通过将父进程的`environ`数组作为参数传递给`posix_spawnattr_setenv`函数,来设置新进程的环境变量。然后将这个`posix_spawnattr_t`类型的对象传递给`posix_spawn`函数,来创建一个新进程。新进程将会继承父进程的环境变量。
阅读全文