系统功能缺陷

时间:2011-04-12 05:49:27

标签: c

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

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

例如:

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

使用system()来解释这个问题是否有任何已知缺陷?

2 个答案:

答案 0 :(得分:2)

system()函数可以完成它应该完成的功能。只要正确调用它,行为就非常可靠。它有两种操作模式:

  1. 检查是否有可用的命令解释器 - 当参数为空指针时。
  2. 运行给定的命令,等待命令完成后再返回。
  3. 因此,system()语句将阻塞,直到运行该命令的shell完成。在类Unix系统上,调用的命令是有效的:

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

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

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

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

答案 1 :(得分:0)

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

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

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

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