3

我们有一个多线程嵌入式应用程序,由于硬件限制太普通,无法在此讨论,因此无论何时输出到文件,都必须将其文件系统重新挂载为 RW。

我们目前正在通过system()调用执行此操作,并运行mount命令。但是,此调用有时会阻塞,并导致应用程序陷入死锁。

在我的调试过程中,我已经system(NULL)在原始system()调用之前放置了,这似乎有时也会阻塞。

一般来说,在什么情况下可能会system()永远阻塞?

4

3 回答 3

8

这是Linux吗?在 Linux 上的 glibc 中,system() 阻塞 SIGCHLD,更改几个信号处理程序、分叉、等待子进程死亡,然后修复它对信号掩码所做的事情。在子进程中,它撤消信号掩码更改并执行 shell 以运行您的命令。这甚至在您调用时也会发生system(NULL)--- 唯一的区别是被调用的 shell 被称为sh -c exit 0.

总之,您正在生成一个进程,加载 shell(及其所有相关库),并等待 shell 终止。你可能会因为加载外壳而被咬伤。

于 2012-11-27T17:40:39.847 回答
2

system()阻塞直到被调用的命令完成,所以如果mount命令永远不会完成,那么system()将永远不会返回。

于 2012-11-27T17:39:51.143 回答
1

我想如果你运行 mount 比你需要 root 权限,所以也许这就是你的情况(摘自man systemLinux):

   Do not use system() from a program with set-user-ID or set-group-ID privileges, because strange values  for  some  environment
   variables  might  be  used  to  subvert  system  integrity.  Use the exec(3) family of functions instead, but not execlp(3) or
   execvp(3).  system() will not, in fact, work properly from programs with set-user-ID or set-group-ID privileges on systems  on
   which  /bin/sh  is  bash  version 2, since bash 2 drops privileges on startup.  (Debian uses a modified bash which does not do
   this when invoked as sh.)
于 2012-11-27T17:44:21.833 回答