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

时间:2011-01-07 05:11:09

标签: c++ c linux system

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

system("pause");

system("myProgram.exe");

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

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

4 个答案:

答案 0 :(得分:13)

system有几个原因是个坏主意:

  • 您的程序将暂停,直到命令完成。
  • 它通过shell运行命令,这意味着你必须担心确保你传递的字符串对于shell来说是安全的。
  • 如果您尝试使用&运行后台命令,它最终会成为孙子进程,并被init进程(pid 1)孤立并进入,您无法使用之后检查其状态。
  • 无法将命令的输出读回程序。

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

答案 1 :(得分:10)

毫不奇怪,该命令仍然是

system("whatever");

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

是的,调用system()通常是一个坏主意。通常有更多的编程方式。

如果您想了解lsmod的工作原理,您可以随时查找其源代码,并查看主要系统调用的内容。然后自己使用这些电话。

快速Google搜索出现this link,表示lsmod正在阅读/proc/modules的内容。

答案 2 :(得分:3)

嗯,lsmod通过解析/proc/modules文件来完成它。那将是我的首选方法。

答案 3 :(得分:0)

我认为你要找的是fork和exec。