代码之家  ›  专栏  ›  技术社区  ›  Nixuz

当可以使用库函数时,使用System()函数是否是一种坏做法?为什么?

  •  6
  • Nixuz  · 技术社区  · 16 年前

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

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

    8 回复  |  直到 14 年前
        1
  •  10
  •   WolfmanDragon    16 年前

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

        2
  •  3
  •   DougN    16 年前

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

        3
  •  3
  •   Jonathan Leffler    16 年前

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

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

    system()函数很方便,但很危险,尤其是因为它通常调用shell。您最好通过fork()和exec()系统调用更直接地在UNIX上调用程序。[请注意,系统调用与调用 system() 功能,顺便说一下!]Otoh,您可能需要担心确保程序中所有打开的文件描述符都已关闭,特别是如果您的程序是代表其他用户运行的某种守护进程;如果您不使用特殊特权,这就没什么问题了,但最好不要让被调用的程序访问您不打算访问的任何内容。D.您可能需要查看 fcntl() 系统调用和 FD_CLOEXEC 旗帜。

    一般来说,如果将功能构建到程序中,就更容易控制事情,但这不是一个微不足道的决定。

        4
  •  2
  •   sunsean    16 年前

    安全是一个问题。一个恶意的卷曲可能会在你的程序中造成破坏。这取决于这是一个个人程序,其中编码速度是您的主要关注点,还是一个商业应用程序,其中安全性是一个因素。

        5
  •  1
  •   bobince    16 年前

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

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

        6
  •  1
  •   rik.the.vik    16 年前

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

    在C程序原型的早期阶段,我经常对grep和sed等程序进行外部调用,以便使用popen()操作文件。它不安全,不安全,当然也不便携。但它能让你快速前进。这对我很有价值。它让我专注于程序真正重要的核心部分,通常是我最初使用C的原因。

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

        7
  •  0
  •   Paul Nathan    16 年前

    我不想这样做,而是使用命令行参数和stdin在应用程序周围建立一个脚本框架。

        8
  •  0
  •   user697111    14 年前

    其他的已经提到了好的点(可靠性、安全性、安全性、可移植性等),但我会抛出另一个。性能。通常,调用一个库函数甚至生成一个新线程要比启动一个新进程快很多倍(然后您仍然需要正确地检查/验证它的执行并分析它的输出!)