1

Linux 上の C++ でアプリケーションをコーディングしています。C++ には、プログラムを実行するための「システム」という関数があります。

次のように C++ から gnome-system-monitor を開こうとします。

system("gnome-system-monitor");

ただし、gnome-system-monitor のウィンドウを閉じるまで、この「システム」関数を呼び出すと、アプリケーションのスレッドがブロックされます。

呼び出し元プロセスをブロックせずにファイルからプロセスを開く他の方法はありますか?

4

4 に答える 4

2

Linux またはその他の POSIX ベースのシステムで動作する古典的な方法は、次のとおりです。

if (0 == fork()) {
  execlp("gnome-system-monitor", "gnome-system-monitor", (char *)NULL);
}

(この例ではエラー処理が省略されています。) これにより、(a) 新しいプロセスが作成され、(b) その新しいプロセスで、PATH 環境変数を検索してそのようなコマンドを見つけた後、「gnome-system-monitor」が実行されます。(c) argv[0] として「gnome-system-monitor」という名前を渡し、他の引数は渡しません。親では、新しいプロセスが作成されると、結果を待たずに先に進みます。

fork詳細については、およびのマニュアル ページを参照しexeclpてください。

于 2012-10-12T06:10:30.310 に答える
1

GnomeはGTk(Glibを​​含む)の上に構築されており、おそらくGlibSpawningProcesses関数が必要です。

もちろん、LinuxとUnixでは、プロセスフォークされます。高度なUNIXプログラミング高度なLinuxプログラミングなどの優れた本を読んで、 プロセスに関連するsyscall、特にfork(2)execve(2)pipe(2)について詳しく学んでください。proc(5)ファイルシステムについても読んでください。

于 2012-10-12T06:06:37.753 に答える
1

fork/exec または posix_spawn。それを使用している場合、glibにはGSpawnもあります。

于 2012-10-12T06:03:39.970 に答える
0

はい。別のスレッドで System 関数を呼び出します。

于 2012-10-12T06:05:38.100 に答える