为什么system()存在?

时间:2018-08-15 21:14:19

标签: c

许多论文中提到对“ system()”的调用是不安全且不可移植的。我不反对他们的观点。

不过,我注意到许多Unix实用程序都具有等效的C库。如果不是这样,则可以从各种各样的工具获得该资源。

尽管许多论文都对goto提出了建议,但仍有一些人可以为它的使用争论不休,并且有简单的理由说明为什么它全部使用C语言。

那么,为什么我们需要system()?已有多少代码依赖于它而不能轻易更改?

3 个答案:

答案 0 :(得分:3)

讽刺性的答案因为如果不存在,人们会问为什么该功能不存在...

更好的答案
许多系统功能不是'C'标准的一部分,而是Linux规范的一部分,而Windows最有可能具有某些等同功能。因此,如果您正在编写仅在Linux环境下使用的应用程序,那么使用这些功能就不是问题,因此实际上很有用。如果您正在编写可以在Linux和Windows(或其他)上运行的应用程序,则这些调用将成为问题,因为它们可能无法在系统之间移植。关键(imo)是您仅了解问题/隐患并进行相应编程(例如,使用适当的#ifdef来保护代码等)

答案 1 :(得分:2)

许多交互式应用程序为用户提供了一种执行Shell命令的方法。例如,在vi中,您可以执行以下操作:

:!ls

,它将执行ls命令。 system()是他们可以用来执行此操作的功能,而不必编写自己的fork()exec()代码。

此外,fork()exec()不能在操作系统之间移植。使用system()使执行shell命令的代码更加可移植。

答案 2 :(得分:1)

您可能会发现,最接近官方“为什么”答案的是C89基本原理。 4.10.4.5系统功能读取:

  

系统功能允许程序暂时中止其执行,以使另一个程序运行完毕。

     

信息可以通过三种方式传递给被调用程序:通过命令行参数字符串,通过环境以及(最可移植)通过数据文件。在调用系统功能之前,调用程序应关闭所有此类数据文件。

     

可以通过两种方式从被调用程序返回信息:通过实现定义的返回值(在许多实现中,作为退出函数参数的终止状态代码由实现作为值返回给调用方由系统功能返回),以及(最方便地)通过数据文件返回。

     

如果环境是交互式的,则信息也可以与交互式设备的用户交换。

     

某些实现提供名为commands'' (for example, date''的内置程序,可以通过系统功能向应用程序提供有用的信息。该标准未尝试表征此类命令,并且它们的使用不可移植。

     

另一方面,只要实现支持该功能,则系统功能的使用是可移植的。该标准允许应用程序通过使用空指针参数调用系统函数来确定这一点。也可以通过这种方式确定是否支持更多级别的嵌套。假设超过一个这样的水平显然是危险的。

除此之外,我要说的主要是出于历史原因。在Unix和C的早期,system是一种便捷的库函数,可以满足几个交互式程序的需要:如上所述,“暂时中止其执行以运行另一个程序”。它的设计不是很好,也不适合任何严肃的任务(对此POSIX的要求使其从根本上讲不是线程安全的,它不允许异步事件在其他程序运行时由调用程序处理,等等)。并且它的使用容易出错(难以安全构造命令字符串)并且不可移植(因为命令字符串的特定形式是实现定义的,尽管POSIX为符合POSIX的实现定义了此形式。)

如果今天正在设计C,则几乎可以肯定不包括system,并且要么将这种功能完全留给实现及其库扩展,要么指定类似于{{1} }和相关界面。