我想从我的C++代码中调用一个带标志的rpm命令并获得输出,但我不想在这个过程中使用shell .

我考虑使用Popen,但看到它使用shell 来执行命令,这是我不想要的. 我可以使用PIPE\FORK\EXEC Long方法,但是我想逐行读取,并且不确定如何使用它,所以我想如果可以在没有中间shell 的情况下使用它来执行的话,我想改用Popen().

我的问题是,是否有一种方法可以在不调用shell 的情况下使用popen(),而只调用带有其标志的二进制文件(例如/usr/bin/rpm-qa)? 要不我就得走长途了?

推荐答案

实际上,这里只有两个选项,要么使用popen,要么使用pipe+fork+exec.这些是在Linux上运行程序并捕获其输出的唯一选项.就是这样,没有其他的可能性了.Linux上的所有系统和C库调用都有公开可用的文档,除此之外没有其他文档.

从理论上讲,popen实现可以解析命令并确定它是否包含任何shell 通配符或特殊字符;如果不包含,则将其拆分成单词,并将生成的程序拆分成exec.popen是否这样做可以通过在strace下使用-f标志对其运行一个简单的测试来确定,并查看派生的子进程实际执行了什么.

但是,即使你自己发现,你目前的glibc做到了这一点,当然,这也不能保证它在future 总是以这种方式工作.

Linux相关问答推荐

OpenCV编译错误&未定义的引用&Quot;

通过ssh传输参数时避免字符串拆分

Bash:将带有新行的字符串转换为带有逗号、内联的唯一值的字符串

/proc/mounts 没有像 /proc/self/mountinfo 这样的源信息

使用 ansible 验证 firewalld 配置

有没有办法确定什么代码使 linux 共享对象inflating ?

使用 grep 时如何跳过第一行和最后一行?

linux 提取字符串中可能是第二常见模式的部分

如何使用 ftrace 过滤查看函数上方的调用堆栈?

使用 AWK 过滤 Linux 输出

Linux 系统调用文档

为什么 fork() 在 setsid() 之前

sed: -i 不能与 Mac OS X 上的标准输入一起使用

在 cron 作业(job)中执行 PHP 脚本

如何在 Linux 中为 C 或 C++ 的进程设置 CPU 亲和性?

更改核心转储的位置

我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗

Docker:您是否try 连接到没有 TLS 的启用 TLS 的守护进程?

bash / Makefile中双美元符号的含义是什么?

如何用逗号而不是空格分割列表