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