我想从我的c++代码中调用带有标志的rpm命令并获得输出,但我不想在此过程中使用shell。
我想使用popen,但看到它使用shell来执行我不想要的命令。我可以使用pipeforkexec long方法,但我想逐行读取,不确定如何使用它,所以我想到使用popen()代替,如果有可能用它来执行,而不需要中间shell。
我的问题是,如果有一种方法可以使用popen(),而不需要它调用shell,只是调用二进制提供它的标志(例如/usr/bin/rpm -qa)?或者我将不得不走一条漫长的路线?
这里只有两个选择,实际上,要么使用popen
,要么使用pipe
+fork
+exec
。这些是Linux上运行程序和捕获其输出的唯一选项。就是这样,没有其他可能了。Linux上所有的系统和C库调用都有公开可用的文档,没有别的了。
理论上popen
实现可以解析命令并确定它是否包含任何shell通配符或特殊字符;如果没有,则将其拆分为words并将生成的程序exec
。popen
是否这样做,可以通过在strace
下运行一个带有-f
标志的简单测试来确定,并查看派生的子进程实际执行了什么。
但是,即使您自己发现当前的glibc是这样做的,当然,这也不能保证它将来总是这样工作。