最近剛學了linux網絡編程裡的套接字,然後也寫了簡單的客戶端和服務器之間連接互相讀寫的簡單程序,一直用輪詢的方式進行讀寫,覺得那樣客戶端和服務器就一直在占用CPU資源,覺得很浪費CPU資源,之前在同一台機上學過用信號量去控制幾個個進程或幾個線程間的讀寫與等待,可是現在是兩台機器間的通信,之前的信號量就用不上了,翻了翻書,找到SELECT這個函數,可以解決問題。
select這個函數可以設置讀寫的阻塞時間(當然也可以設成永久阻塞)
以下是一個簡單的代碼:
- #include <unistd.h>
-
- int main()
- {
- int nread;
- char buffer[128];
- fd_set inputs;
-
- FD_ZERO(&inputs);
- FD_SET(0,&inputs);
-
-
- select(FD_SETSIZE, &inputs, NULL, NULL, NULL);
- printf("aaaaaa\n");
- nread = read(0,buffer,sizeof(buffer));
- buffer[nread] = '\0';
- printf("%s",buffer);
-
- }
- ~
- ~
運行以後不輸入任何東西就會阻塞在SELECT這一行,直到輸入數據程序才往下運行。
當然也可以設置阻塞的時間
- #include <sys/time.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
-
- int main()
- {
- int nread;
- char buffer[128];
- fd_set inputs;
- struct timeval timeout;
-
- FD_ZERO(&inputs);
- FD_SET(0,&inputs);
-
-
- timeout.tv_sec = 2;//2秒
- timeout.tv_usec = 500000;//0.5秒
- /*加起來是2.5秒*/
-
-
- select(FD_SETSIZE, &inputs, NULL, NULL, &timeout);
- printf("aaaaaa\n");
- nread = read(0,buffer,sizeof(buffer));
- buffer[nread] = '\0';
- printf("%s",buffer);
-
- }
這樣就會阻塞2.5秒後往下執行了!