c语言spawn函数什么作用,c-为什么posix_spawn()在popen()工作的地方失败?

我已成功使用popen()从我的C程序中运行命令.据我了解,它在幕后使用了fork()和exec()(或它们的变体).效果很好:

FILE *fd = popen("xterm", "r");

pclose(fd);

…将如预期的那样打开一个新的xterm窗口.

现在,我正在尝试使用posix_spawn()实现相同的功能,我理解这可能对资源更友好,尤其是如果我们不打算与新的子进程进行通信时,尤其如此:

/* p.we_wordv contains the argv, index 0 holds the actual command */

pid_t pid;

posix_spawnp(&pid, p.we_wordv[0], NULL, NULL, p.we_wordv, NULL);

…但这对于xterm作为命令,在父项的输出中产生以下内容:

xterm: Xt error: Can't open display:

xterm: DISPLAY is not set

尝试启动其他进程将产生其他错误消息,无提示地失败,或者在某些情况下(如ls)按预期工作.这使我很难真正看到一种模式.

您能否指出是什么导致第二种方法的行为不同于第一种?

解决方法:

消息未设置DISPLAY告诉您xterm找不到DISPLAY环境变量.所有图形输出程序均使用此环境变量连接到屏幕.

由于环境为空,因此未找到变量(这是posix_spawnp函数调用中的最后一个NULL).看来popen重用了当前进程的环境,所以它没有这个问题.

您可能想要传递仅包含所需内容的手动创建的环境,或者仅传递过程所具有的任何环境.后者更灵活(xterm将从您的进程继承各种配置设置,而这些配置设置则从您的shell继承它们),但可能存在安全风险.

要访问您的流程环境,请使用environ全局变量或更改您的main函数以接收其他参数:

int main(int argc, char *argv[], char *envp[])

{

...

posix_spawnp(&pid, p.we_wordv[0], NULL, NULL, p.we_wordv, envp);

}

标签:popen,spawn,c-3,linux

来源: https://codeday.me/bug/20191109/2012814.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`posix_spawn` 是一个 POSIX 标准中定义的函数,用于在当前进程的上下文中启动一个新的进程。它与 `fork/exec` 组合不同,因为它允许您控制新进程的环境,工作目录等方面。使用 `posix_spawn`,您可以更轻松地启动和管理进程,而无需执行多次系统调用。 `posix_spawn` 函数的原型如下: ```c #include <spawn.h> int posix_spawn(pid_t *pid, const char *path, const posix_spawn_file_actions_t *file_actions, const posix_spawnattr_t *attrp, char *const argv[], char *const envp[]); ``` 参数解释如下: - `pid`:指向 `pid_t` 类型变量的指针,用于存储新进程的进程 ID。 - `path`:要执行的可执行文件的路径。 - `file_actions`:指向 `posix_spawn_file_actions_t` 类型变量的指针,用于指定文件操作的内容。如果不需要文件操作,则传递 `NULL`。 - `attrp`:指向 `posix_spawnattr_t` 类型变量的指针,用于指定新进程的属性。如果不需要任何属性,则传递 `NULL`。 - `argv`:指向一个以 `NULL` 结尾的字符串数组,包含新进程的命令行参数。 - `envp`:指向一个以 `NULL` 结尾的字符串数组,包含新进程的环境变量。 `posix_spawn` 函数返回值为 0 表示成功,否则表示失败。在成功启动新进程后,可以通过 `pid` 指向的变量获取新进程的进程 ID。 需要注意的是,`posix_spawn` 函数只在 POSIX 环境下可用,因此它无法在 Windows 等非 POSIX 环境下工作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值