【问题标题】:What are common uses for the system (3) command?system (3) 命令的常见用途是什么?
【发布时间】:2019-12-12 00:20:00
【问题描述】:

我在阅读著名的C Language Book (1988) 时遇到了the command。这个命令现在常用吗?

来自本书(第 7.8.4 节):

函数system(char *s)执行包含在 字符串 s,然后继续执行当前程序。这 s 的内容很大程度上取决于本地操作系统。作为一个 简单的例子,在 UNIX 系统上,语句
system("date");
导致程序 date 运行...

我的印象是 fork-and-exec 是从当前程序运行另一个程序的主要方式...

【问题讨论】:

  • Fork/exec 不是标准 C,不是做同样的事情
  • 在 unix 系统上,system(cmd) 实际上是 fork() + execl("/bin/sh", "sh", "-c", cmd, (char *)NULL) + waitpid()

标签: c standard-library c89


【解决方案1】:

system 它是标准 C 库中的 函数,它允许 C 程序调用外部(即操作系统级别)命令。

(几乎)一切都在上面的句子中:函数是标准 C,这意味着任何符合标准的实现都支持它。但是操作系统所做的是错误的......只是依赖于操作系统。

它应该是编写可移植程序的首选方式(因为它是标准 C),但不幸的是:

  1. 并非所有操作系统都支持相同的命令和/或相同的语法
  2. 众所周知,大多数系统都有一些警告

后半部分与安全性有关:许多操作系统(至少我所知道的)都有一个可配置的 path 在其中搜索命令,在这种情况下,system 函数确实使用该路径.问题是,通过更改路径,如果有人设法在他们控制的地方安装了具有相同名称的不同命令,并且还设法更改了路径。

这就是为什么system 通常不受欢迎的原因,细心的程序员只依赖较低级别的系统相关函数,如 Unix 上的 fork+exec 或 Windows 上的 CreateProcess,或者对从 @987654324 调用的命令使用绝对路径@。但是你需要一种相当复杂的配置方式来适应各种系统的绝对路径......

【讨论】:

  • 啊,忘记了 Windows(以及所有使用 C 的非 Unix 操作系统)。他们肯定会有自己喜欢的程序运行方式。
  • 我认为system 命令的目的是允许程序通过从命令行或文本文件接收到的特定于操作系统的字符串来执行任意操作。文本文件或命令行参数需要根据目标操作系统进行调整,但 C 源文本不需要。
猜你喜欢
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多