当可以使用库函数时,使用system()函数是不好的做法吗?为什么?

时间:2009-02-04 01:25:10

标签: language-agnostic system-calls

假设正在开发的应用程序需要一些功能,可以通过对命令行程序或使用库进行系统调用来实现。假设效率不是问题,那么简单地对程序进行系统调用而不是使用库是不好的做法吗?这样做的缺点是什么?

为了使事情更具体,这个场景的一个例子是需要从Web服务器下载文件的应用程序,可以使用cURL程序或libcURL库。

8 个答案:

答案 0 :(得分:10)

除非您只为一个操作系统编写代码,否则无法知道您的系统调用是否可以正常工作。系统更新或操作系统升级时会发生什么? 如果有库可以执行相同的功能,从不使用系统调用。

答案 1 :(得分:3)

我更喜欢库,因为它存在依赖性问题,即当你调用它时可执行文件可能不存在,但库将是(假设在你的平台上启动进程时需要处理外部库引用)。换句话说,使用库似乎可以保证在比系统调用更多的环境中获得更稳定,可预测的结果。

答案 2 :(得分:3)

有几个因素需要考虑。一个关键因素是外部程序是否会出现在安装软件的所有系统上的可靠性。如果它有可能会丢失,那么可能最好在你的程序中进行。

权衡这一点,您可能会认为加载到程序中的额外代码是禁止的 - 您不需要为应用程序中这样一个很少使用的部分代码膨胀。

system()函数很方便,但很危险,尤其是因为它通常会调用shell。你可能最好直接调用程序 - 在Unix上,通过fork()和exec()系统调用。 [请注意,系统调用与调用system()函数非常不同,顺便提一下!] OTOH,您可能需要担心确保程序中的所有打开文件描述符都已关闭 - 特别是如果您的程序是某种守护程序代表其他用户运行;如果你没有使用特殊权限,这不是一个问题,但是不要让被调用的程序访问你不想要的任何东西。您可能需要查看fcntl()系统调用和FD_CLOEXEC标记。

通常,如果在程序中构建功能,则更容易控制事物,但这不是一个微不足道的决定。

答案 3 :(得分:2)

安全是一个问题。恶意cURL可能会对您的程序造成严重破坏。这取决于这是一个以编码速度为主要焦点的个人程序,还是安全性等因素的商业应用程序。

答案 4 :(得分:1)

系统调用很难安全地进行。

需要对各种有趣的字符进行正确编码以传递参数,并且编码类型可能因平台甚至版本的命令而异。因此,进行包含任何用户数据的系统调用需要进行大量的健全性检查,并且很容易出错。

答案 5 :(得分:1)

是的,如上所述,请记住系统调用(如fcntl()和open())与system()调用之间的区别。 :)

在c程序原型设计的早期阶段,我经常使用popen()来调用grep和sed之类的程序来操作文件。它不安全,不安全,而且肯定不便携。但它可以让你快速前进。这对我很有价值。它让我专注于程序的真正重要核心,通常是我首先使用c的原因。

在高级语言中,你最好有一个很好的理由。 :)

答案 6 :(得分:0)

我没有使用它,而是使用命令行参数和stdin在你的应用程序周围构建一个脚本框架。

答案 7 :(得分:0)

其他人已经提到了好处(可靠性,安全性,安全性,可移植性等) - 但我会抛弃另一个。性能。一般来说,调用库函数或者生成一个新线程的速度要快很多,然后启动一个全新的进程(然后你仍然必须正确检查/验证它的执行并解析它的输出!)