我们在Linux中使用C语言。 system()
函数是否有可能以意想不到的方式表现,尤其是当我们处理信号时?
我们发现有时,system()
函数会阻止执行,或者它会抛出SIGSEGV
。
例如:
system ( "/bin/mv a b" );
使用system()
来解释这个问题是否有任何已知缺陷?
答案 0 :(得分:2)
system()
函数可以完成它应该完成的功能。只要正确调用它,行为就非常可靠。它有两种操作模式:
因此,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()
函数中的缺陷,它的行为完全符合预期。