2011-10-05 143 views
0

我寫了一個服務器程序,可以使用fork()處理多個客戶端。我有一個信號處理程序,在需要時進行錯誤檢查,並且一切正常。如果客戶端輸入'quit',服務器應該停止接受連接,讓已打開的客戶端完成通信,並在所有客戶端關閉後關閉。要做到這一點,無論何時輸入'quit',我的int標誌都被設置爲0.由於每個子進程中的變量僅用於該進程,並且不影響其他子進程或父進程,所以我可以「T跟蹤,當標誌被設置爲0。在我的信號處理程序我檢查fork() - 關閉服務器

if(count == 0 && flag == 0) 
    //close server and exit program 

計數的客戶端數量開啓之後他們都將關閉,顯然是零(這已經被錯誤校驗以確保它是正確的)。有誰知道我可以創建可以在一個客戶端設置標誌的方式,並且對每個客戶端都有相同的價值嗎?如果這是有道理的..順便說一句,我在C編碼。

+1

很多方法可以做到這一點。這裏有一個有用的關鍵字是「進程間通信」http://en.wikipedia.org/wiki/Inter-process_communication – HostileFork

回答

0

你需要實現一個單獨的服務器供大家說話,他會向所有的客戶端廣播,並用客戶端計數來更新它們,但實質上並沒有太多複雜功能來說話和跟蹤所有其他客戶是一個挑戰。

這也是在不同客戶端之間路由和傳輸消息的地方。

希望這照耀一些光。

0

子進程接收quit命令需要發送一個信號(如SIGUSR1 - 我不爲此,建議SIGTERM,除非你將要儘快結束所有的客戶端)到其父,並讓父母在該信號處理程序中設置存儲空間的標誌。 (父母可以通過在某處存儲getpid()的結果讓每個人都知道它的pid。)

+0

這將工作,我幾乎用了SIGUSR1,但後來我記得exit()狀態。 。呃..這花了我幾秒鐘來補充,一切都像我想要的那樣工作 – newuser12

+0

嗯,你沒有說發出'quit'的客戶端馬上要斷開連接,只是服務器應該開始有序關閉。 :-) –

+0

是的,絕對應該把它放在我的細節的某個地方,但是我從這些答案中學到的東西比以往任何時候都要多:)感謝你們 – newuser12

0

有許多IPC機制可以做到這一點...特別是信號量浮現在腦海中。您可以創建一組兩個信號量,並使用一個用於您的孩子數量,另一個用於您的退出標誌。當您啓動程序時,客戶端計數將被初始化爲零,並且退出標誌將被初始化爲1。當每個孩子開始時,它應該爲客戶計數加1,並在退出時減1。當客戶端收到退出命令時,它將歸零退出標誌。當兩個信號都達到零時,主程序會知道什麼時候完成。

或(如果可能的話),你可以只啓動線程,而不是分叉過程,並用兩個全球int S表示countflag和全局互斥鎖保護他們。 pthread API非常容易用於不需要進行大量線程間通信的簡單事情,並且創建線程的速度要快於fork + exec