gpt4 book ai didi

c - 为什么 posix_spawn() 在 popen() 工作的地方失败?

转载 作者:太空狗 更新时间:2023-10-29 11:07:02 24 4
gpt4 key购买 nike

我成功地使用 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 is not set 告诉您 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);
}

关于c - 为什么 posix_spawn() 在 popen() 工作的地方失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48876134/

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