繁体   English   中英

看到Linux系统()调用偶尔阻塞

[英]Linux system() call seen to sporadically block

我们有一个多线程的嵌入式应用程序,由于这里讨论的硬件限制太平凡,每当它输出到文件时,必须将其文件系统重新安装为RW。

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

在调试期间,我在原始system()调用之前放置了system(NULL) ,这似乎有时也会阻塞。

一般来说,在什么情况下system()阻止所有永恒?

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

总而言之,您正在生成一个进程,加载shell(及其所有相关库),并等待shell死亡。 你可能会因加载shell而受到攻击。

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

我想如果你运行mount比你需要root权限,那么也许这是你的情况(摘自Linux上的man system ):

   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.)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM