从C,C++在Linux中发出系统命令

8bi*_*dge 3 c c++ linux system

我知道在DOS/Windows应用程序中,您可以使用如下行来从代码发出系统命令:

system("pause");
Run Code Online (Sandbox Code Playgroud)

要么

system("myProgram.exe");
Run Code Online (Sandbox Code Playgroud)

......来自stdlib.h.是否有类似的Linux命令,如果是这样,我会找到哪个头文件?

此外,这被认为是糟糕的编程习惯吗?我正在考虑使用该lsmod命令获取加载的内核模块列表.这是个好主意还是坏主意?我发现一些网站似乎以负面的方式查看系统调用(至少是系统("暂停");).

R..*_*R.. 13

system 由于以下几个原因,这是个坏主意:

  • 您的程序将暂停,直到命令完成.
  • 它贯穿一个外壳,这意味着你不必担心确保你把这个字符串是安全的外壳,以评估该命令.
  • 如果你试图运行一个后台命令&,它最终成为一个孙子进程,并被init进程(pid 1)孤立并被接收,之后你无法检查它的状态.
  • 无法将命令的输出读回程序.

对于第一个也是最后一个问题,popen是一个解决方案,但它没有解决其他问题.您应该使用forkexec(或posix_spawn)自己运行任何外部命令/程序.

  • 另请注意,对于OP的特定需求,解析`/ proc/modules`而不是使用`lsmod`是正确的解决方案. (2认同)

chr*_*ock 10

毫不奇怪,命令仍然存在

system("whatever");
Run Code Online (Sandbox Code Playgroud)

标题仍然是stdlib.h.该头文件的名称意味着"标准库",这意味着它位于支持C的每个标准平台上.

是的,打电话system()往往是个坏主意.通常有更多程序化的做事方式.

如果你想看看它是如何lsmod工作的,你总是可以查找它的源代码并查看它所做的主要系统调用.然后自己使用这些电话.

快速Google搜索会显示此链接,表示lsmod正在阅读的内容/proc/modules.