posix_spawn,举详细例子解释其用法
时间: 2024-11-09 07:20:28 浏览: 13
`posix_spawn`是POSIX(Portable Operating System Interface)提供的一种用于创建新进程的API,它比传统的`fork()`和`execve()`组合更加灵活,可以更好地管理和配置新进程的环境。下面是一个简单的例子,展示如何使用`posix_spawn`启动一个新进程并传递命令行参数:
```cpp
#include <sys/types.h>
#include <unistd.h>
#include <spawn.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
// 创建进程属性结构
posix_spawnattr_t spawn_attr;
if (posix_spawnattr_init(&spawn_attr) != 0) {
perror("Failed to initialize spawn attribute");
return -1;
}
// 设置进程继承父进程的标准输入、输出和错误流
pid_t child_stdin = fileno(stdin);
pid_t child_stdout = fileno(stdout);
pid_t child_stderr = fileno(stderr);
if (posix_spawnattr_setsigdefault(&spawn_attr, SIGCHLD, SIG_DFL) != 0 ||
posix_spawnattr_setflags(&spawn_attr, POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_CLOSEFROMPARENT) != 0 ||
posix_spawnattr_setpgroup(&spawn_attr, getpgrp()) != 0) {
perror("Failed to set spawn attributes");
posix_spawnattr_destroy(&spawn_attr);
return -1;
}
if (posix_spawnattr_setctty(&spawn_attr, true) != 0) {
perror("Failed to set chtty");
}
// 定义新进程的启动环境
const char* exec_path = "/usr/bin/env"; // 要执行的程序路径
char* arg_array[] = {"bash", "-i", NULL}; // 命令行参数
size_t num_args = sizeof(arg_array) / sizeof(char*);
// 创建新进程
pid_t pid;
char* envp = environ; // 父进程的环境变量列表
if (posix_spawn(&pid, exec_path, &spawn_attr, NULL, arg_array, envp) != 0) {
perror("Failed to start the process");
posix_spawnattr_destroy(&spawn_attr);
return -1;
}
// 关闭旧环境的引用
close(child_stdin);
close(child_stdout);
close(child_stderr);
printf("Launched a new process with PID %d\n", pid);
// 清理资源
posix_spawnattr_destroy(&spawn_attr);
wait(NULL); // 等待子进程结束
return 0;
}
```
在这个例子中,我们创建了一个新的进程,执行的是`bash -i`命令,即一个交互式bash shell。`posix_spawnattr_init`初始化进程属性,`posix_spawnattr_setsigdefault`设置默认信号处理策略等。`posix_spawn`函数最后启动了新进程,而父进程会立即返回,不再继续执行。
阅读全文