2012-03-01 9 views
0

私はゲームに取り組んでいるので、ある時点でfork()を使用しなければならず、メインスレッドはOpenGLグラフィックスを実行し、子スレッドはゲームロジックを実行します。C++でforkしたプロセスをどのようにしてkillできますか?

今問題があります。ある時点で、ユーザは、セカンダリスレッドによって処理されるゲーム内の「終了」ボタンを押すことができる。また、ある時点で、メイン(glut)スレッドによって処理されるゲームを終了するために、Xボタンをクリックすることができる。だからここに私の質問です:どのように私は他の実行中のスレッドを殺すことができます終了しますか?

今すぐウィンドウを閉じると、2番目のスレッドは実行を継続し、2番目のスレッドが終了すると、1番目のスレッドは実行を継続します。

atexit機能を使用して 'X'ボタンを操作することができましたが、glutMainLoop()を殺す(安全な)方法が見つかりませんでした。

+5

fork()は新しいスレッドではなく、新しいプロセスを作成します。 – Puppy

+0

私は...スレッドとプロセスの違いは何ですか? – Tibi

+2

正確に何をフォークしましたか?私は、フォークがゲーム(または実際にはデスクトップソフトウェア)で望ましいという理由を考えることはできません。 Windowsは、同様の機能を提供していません。 –

答えて

1

実際にfork()(新しいスレッドを開始するのではなく)を呼び出す場合は、実際に別の実行プロセスを作成しています。 fork()が呼び出されると、親プロセスにprocess-idが返されます。プロセスを終了するには、kill()に渡すことができます。 Linuxの下では、これは次のようになります。

#include <signal.h> 

pid_t pid = fork(); 
if (pid == 0) { 
    // you are in the child process 
} else if (pid > 0) { 
    // you are in the parent process 
    ... 
    // send a termination signal 
    kill(pid, SIGTERM); 
} else { 
    // fork had an error which should be logged... 
} 

プロセスに送信する信号を選択する必要があります。例えばSIGKILL(9)はそれを難し​​くします。

+0

+1タイトルを読んだときに最初に思ったこと。 – slashmais

0

正確にはthreadprocessについては、それぞれ異なるテーマを説明しています。

fork()を使用しているので、実際にプロセスを処理しています。プログラムがメモリに1回だけ必要となるため、より効率的なメモリで、扱いやすくなるので、代わりにthreadsを使用することをお勧めします。もちろん、重要なセクションを自分で処理する必要があります。

Hereはスレッドを処理するための良い例です。

プロセスを使用することを強くお勧めする場合は、fork()でもシグナルを送信して特定のシグナルハンドラを実装できます。私はhttp://tldp.org/LDP/lpg/node7.htmlのようなIPC(Inter Process Communication)に関する記事も読んでいます。

関連する問題