我正在嘗試製作一個簡單的客戶端 - 服務器聊天程序。在客戶端,我分離出另一個線程來讀取來自服務器的任何傳入數據。問題是,當一個人從主線程註銷時,我想優雅地終止第二個線程。我試圖使用共享變量'running'來終止,問題是,socket read()命令是一個阻塞命令,所以如果我這樣做(運行== 1),服務器必須在讀取返回之前發送一些內容並且可以再次檢查時間條件。我正在尋找一種方法(只有常見的unix套接字)來執行非阻塞式讀取,基本上某種形式的peek()可以工作,因爲我可以不斷檢查循環以查看是否完成。C- Unix套接字 - 無阻塞讀取
閱讀線程循環如下,現在它沒有共享變量的任何互斥量,但我打算補充,以後不用擔心! ;)
void *serverlisten(void *vargp)
{
while(running == 1)
{
read(socket, readbuffer, sizeof(readbuffer));
printf("CLIENT RECIEVED: %s\n", readbuffer);
}
pthread_exit(NULL);
}
sd + 1在這種情況下意味着什麼?我像這樣運行它,並且它能夠工作,但它會像循環20次那樣循環,然後停止,直到創建新輸入,但它像我想要的那樣優雅地終止,唯一的問題是20次。它幾乎就像它在超時或運行期間運行的那樣 – will
您可以在終端中輸入「man select」以獲取選擇功能的詳細說明。因爲在這裏我們只有一個描述符,所以我只寫(sd + 1)。 – fghj
大約20次不瞭解說明。我的代碼在你的第一個問題的上下文應該是這樣的:1)檢查標誌(退出的時間?)2)睡眠直到輸入或超時3)讀取一些東西4)goto(1)。所以它會延遲退出。但是你應該處理另一方關閉連接時的情況,然後選擇返回控制給你,但是「讀取」將讀取0字節,並且你得到了繁忙循環。所以你應該檢查「read」的結果,如果它爲零,則退出循環。 – fghj