3

マルチスレッドの組み込みアプリケーションがあります。ハードウェアの制約により、ここで説明するには平凡すぎるため、ファイルに出力するたびにファイルシステムを RW に再マウントする必要があります。

system()現在、呼び出しを介してこれを行っており、mountコマンドを実行しています。ただし、この呼び出しがブロックされ、アプリケーションがデッドロック状態になることがあります。

デバッグ中にsystem(NULL)、元のsystem()呼び出しの前に配置しましたが、これもブロックされることがあります。

一般的に言えば、どのような状況でsystem()永遠にブロックされる可能性がありますか?

4

3 に答える 3

8

これはLinuxですか?Linux の glibc では、system() は SIGCHLD をブロックし、いくつかのシグナル ハンドラー (フォーク) を変更し、子プロセスが終了するのを待ってから、シグナル マスクに対する処理を修正します。子プロセスでは、シグナル マスクの変更を元に戻し、シェルを実行してコマンドを実行します。これは呼び出し時にも発生しますsystem(NULL)--- 唯一の違いは、呼び出されたシェルが次のように呼び出されることです。sh -c exit 0.

つまり、プロセスを生成し、シェル (および関連するすべてのライブラリ) をロードして、シェルが終了するのを待っています。シェルをロードして噛まれている可能性があります。

于 2012-11-27T17:40:39.847 に答える
2

system()呼び出されたコマンドが完了するまでブロックするため、コマンドが完了しない場合はmount戻りsystem()ません。

于 2012-11-27T17:39:51.143 に答える
1

ルート権限が必要な場合よりもマウントを実行する場合は、おそらくこれがあなたのケースです(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 に答える