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

4

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

system("pause");

或者

system("myProgram.exe");

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

此外,这被认为是不良的编程实践吗?我正在考虑尝试使用lsmod命令获取已加载的内核模块列表。这是个好主意还是坏主意?我发现一些网站似乎对系统调用(至少是system("pause");)持负面态度。


我认为你可以使用 system("lsmod") 或 system("/usr/bin/lsmod") 来完成它...(使用 which lsmod 查看其位置)... 这是你想要的吗? - nonopolarity
1
为什么要调用“pause”?如果你想在继续之前等待用户按下一个按钮,可以使用getch();或std::cin.get();我同意使用system("pause");非常不好的形式。 - DeveloperChris
4个回答

16

system 函数有多个缺陷:

  • 程序会一直等待命令完成,期间无法执行其他操作。
  • 该函数会通过 shell 执行命令,你需要确保传递的字符串安全,以免被 shell 解释错误。
  • 如果使用 & 尝试在后台运行命令,则该命令最终会成为一个孙子进程并被 init 进程(pid 1)收养,此后你将无法查询其状态。
  • 无法将命令的输出结果返回到你的程序中。

针对第一个和最后一个问题,popen 是一种解决方案,但它并不能解决其他问题。建议在运行外部命令/程序时使用forkexec(或 posix_spawn)函数。


很好的危险说明。是的,posix_spawn() 是首选方法。 - chrisaycock
2
还要注意,针对OP的特定需求,解析/proc/modules而不是使用lsmod是正确的解决方案。 - R.. GitHub STOP HELPING ICE
1
我以前没有见过posix_spawn(),但是参数列表太长了,真是惊人。我觉得值得一提的是,system()的这些缺点是针对你要实现的特定目标而言的。我经常使用它来执行命令的shell解释(当然除了后台命令),因为我只需要副作用或退出代码。 - boycy
@boycy:system 命令提供的功能远远超出了你所需要的。它会干扰你的信号处理,执行非线程安全操作等,除此之外还会带来 shell 的危险。 - R.. GitHub STOP HELPING ICE
system 给你的远不止你想要的” - 我的观点是这不是一个普遍的真理。有时列出的行为恰恰是我想要的,因此尽管 system 不总是正确的,但它也不总是错误的。(当然,在 OP 的情况下是错误的。) - boycy

11

毫不意外,该命令仍然有效

system("whatever");

头文件仍然是stdlib.h。该头文件的名称意味着“标准库”,这意味着所有支持C语言的标准平台都有它。

是的,调用system()通常是一个坏主意。通常有更多编程方式来达到相同的目的。

如果您想了解lsmod如何工作,可以查看其源代码并查看它使用的主要系统调用。然后您可以自己使用这些调用。

快速的Google搜索结果显示此链接,表明lsmod正在读取/proc/modules的内容。


3

好的,lsmod是通过解析/proc/modules文件来实现的。这是我推荐的方法。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接