4

私は幅メモリとパフォーマンスに敏感なマルチスレッドサーバーを書いています。したがって、通常は時間がかかりすぎるすべてのプロセスメモリのクローンを使用しない標準system()および呼び出しの代替手段が必要です。popen()fork()

どうやら、vfork()それexecve()を作るためにそれを使用する必要があります。

誰かが2つの機能で私を助けてくれますか?

  • system()通話の交換。動作の例: 1つのスレッドが関数を呼び出して実行しtouch filename、実行が終了するまで待機しているスレッドを呼び出します。(他のすべてのスレッドは引き続き機能する必要があります)
  • popen()呼び出しの置換動作の例:同じ動作ですが、コマンドの出力を取得する必要がありますls -flags(このコードの代替:正しいコード-popenを使用したノンブロッキングパイプ

ありがとう

4

2 に答える 2

3

これは、提案されたソリューションにアプローチする方法の単なる提案です。あなたが尋ねている2つの特定の行動について:

  • touch:タッチしたいファイルを開閉することで同様の効果が得られます
    • O_TRUNCフラグを使用しないように注意してくださいopen
  • lsdirent.h: POSIXシステムで 使用し、結果を確認する必要があるため、もう少し面倒です。
    • opendir
    • readdir
    • 終わったら必ず電話closedirしてください

systempopen呼び出しをを使用して同等のものに置き換えたい場合vforkは、注意が必要です。子が呼び出しの直後vfork以外のことを行うと、親のメモリ状態が破損する可能性があるため、呼び出しの使用には少し注意が必要です。exec

あなたの代わりにsystem

  • 引数で指定された文字列を実行するヘルパープログラムを作成します
    • ヘルパープログラムはsystem、指定された引数を呼び出すか、コマンド文字列を解析して呼び出すことができますexec
  • 置換関数でsystem、ヘルパープログラムを呼び出す引数ベクトルを作成し、このプログラムの引数として実際に実行するプログラム文字列を渡します。
  • あなたが電話した後vfork、あなたはすぐexecに子供のヘルパープログラム
  • 親は子が完了するのを待ちます

popen代わりに:

  • stdoutおよびファイル記述子を引数として受け入れるヘルパープログラムとstdin、実行するコマンドの文字列を作成します
    • ヘルパープログラムは、引数で示されているように、渡された記述子を、0または1(または両方)に複製します。
    • popenヘルパープログラムは、親と子の間でデータをプロキシして文字列を実行するかexec、コマンド文字列を解析した後に呼び出すことができます。
  • popen置換関数で、または通信チャネルpipeを作成し(2番目の関数パラメーターに従って)、ヘルパープログラムを呼び出すための引数ベクトルを作成し、適切なファイル記述子番号とコマンド文字列を引数として渡します。stdoutstdinpopen
  • あなたが電話した後、あなたは子供のヘルパープログラムvforkをすぐに行いますexec
  • pclose子プロセスを取得するには、交換が必要です
于 2012-06-11T21:41:03.533 に答える
0
Another way is to use the "fork()" with "execvp()" in child process. as mentioned by @jxh

int pid = fork();

if( pid == 0)
{
// In child process
  // redirect stderr/stdinput/stdoutput
  // prepare the execution command
  //use the exec() family of functions as per specific requirement.
}
else
{
// In parent process
  // check for open pipes and close the Std Output/Input/Error pipes.
}

詳細参照

https://www3.physnet.uni-hamburg.de/physnet/Tru64-Unix/HTML/APS33DTE/DOCU_004.HTM

于 2019-11-13T14:07:33.533 に答える