2012-03-01 32 views
0

我正在開發一款遊戲,所以我不得不使用fork(),主線程運行opengl圖形,並且子線程運行遊戲邏輯。如何殺死C++中的分叉進程?

現在我有一個問題。在某些時候,用戶可以按下由輔助線程處理的遊戲內的「退出」按鈕。另外,在某些時候,用戶可以點擊X按鈕退出由主(過剩)線程處理的遊戲。所以這裏是我的問題:我怎樣才能殺死其他正在運行的線程並退出?

現在,如果關閉窗口,第二個線程繼續運行,並且第二個線程完成,第一個線程繼續運行。

處理「X」按鈕可以使用atexit函數完成,但我沒有找到(安全)殺死glutMainLoop()的方法。

+5

fork()創建一個新進程,而不是一個新線程。 – Puppy 2012-03-01 16:54:05

+0

我明白了...... thread'和'process'之間有什麼區別呢? – Tibi 2012-03-01 16:54:58

+2

你究竟做了什麼?我想不出在遊戲中(或者真的是任何桌面軟件)分叉的理由。 Windows甚至不提供類似的功能。 – 2012-03-01 16:55:33

回答

1

如果你實際上調用fork()(而不是啓動一個新的線程),那麼你實際上正在創建另一個正在運行的進程。當調用fork()時,它將一個進程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 2012-03-01 17:07:44

0

由於它們描述的是不同的主題,因此請準確地約爲threadprocess

由於您使用的是fork(),您實際上是在處理流程。我建議你改用threads,因爲它具有更高的內存效率(因爲程序只需要在內存中存儲一​​次)並且更容易處理。當然,你必須自己處理關鍵部分。

Here是一個很好的使用線程的例子。

如果你堅持使用進程和fork(),你仍然可以發送信號和實現特定的信號處理程序。我還會閱讀一些關於IPC(Inter Process Communication)的文章,如http://tldp.org/LDP/lpg/node7.html