【问题标题】:system function flaws系统功能缺陷
【发布时间】:2011-04-12 05:49:27
【问题描述】:

我们在 Linux 中使用 C。 system() 函数是否有可能以意想不到的方式运行,尤其是在我们处理信号时?

我们发现有时,system() 函数会阻塞执行或抛出 SIGSEGV

例如:

system ( "/bin/mv a b" );

使用system() 是否有任何已知缺陷可以解释这一点?

【问题讨论】:

  • system() 总是 阻塞直到命令完成。
  • 但是 mv 命令不需要太多时间,对吧?
  • 这取决于:如果您要从不同的分区移动大文件,可能需要一些时间才能完成
  • 我知道系统在大多数情况下都能正常工作,我只想知道它何时以及它可能会失败或它的行为是意外的!
  • @Overbose,不,我将文件移动到同一个文件系统中! ,虽然我的问题是它会无限期地阻塞有时或有时我得到 sigsegv ,所以仅阻塞不是问题!

标签: c


【解决方案1】:

system() 函数完成了它应该做得非常好的事情。只要正确调用该行为,它就非常可靠。它有两种操作模式:

  1. 检查是否有可用的命令解释器 - 当参数为空指针时。
  2. 运行给定的命令,等待命令完成后再返回。

因此,system() 语句会一直阻塞,直到运行该命令的 shell 完成。在类 Unix 系统上,调用的命令实际上是:

"sh", "-c", "...argument to system...", NULL

这意味着传递的字符串由 shell 解释。这需要多长时间取决于执行的命令。如果需要,可以考虑使用 shell 符号在后台运行命令:

system("( /bin/mv a b & )");

system() 本身会生成 SIGSEGV 的情况很少。您必须向它传递一个无效指针,一个指向程序中某个无效位置的指针。

【讨论】:

    【解决方案2】:

    在执行完成之前,system() 调用是 supposed to block。如果将 a 移动到 b 需要一个小时,则调用 system() 的进程或线程将阻塞一个小时。知道了这一点,就可以解释奇怪的行为了。

    如果您希望system() 立即返回,这可能意味着您希望在看到奇怪行为时已经输入调用它之后运行的代码。很有可能,由于system() 花费的时间比预期的要长,某些内存区域没有分配或初始化。当另一个线程或进程试图访问它时,这可能是导致分段错误的原因。

    换句话说,如果您没有期望 system() 阻止,您可能认为后面的代码会比实际运行得更快。

    揭穿这将是另一个问题的主题。这个问题的答案是否定的,你没有看到 system() 函数中的缺陷,它的行为完全符合预期。

    【讨论】:

    • @Michael - 我认为 OP 看到的 SEGV (可能)是由于在 system() 之后的代码没有在预期的时间内到达,因为 OP 没想到它会堵塞。我更新了我的答案。由于 OP 将字符串文字作为参数传递,这似乎是一个可能的解释。
    猜你喜欢
    • 2021-10-13
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    相关资源
    最近更新 更多