Linux程序设计SELECT系统调用


最近刚学了linux网络编程里的套接字,然后也写了简单的客户端和服务器之间连接互相读写的简单程序,一直用轮询的方式进行读写,觉得那样客户端和服务器就一直在占用CPU资源,觉得很浪费CPU资源,之前在同一台机上学过用信号量去控制几个个进程或几个线程间的读写与等待,可是现在是两台机器间的通信,之前的信号量就用不上了,翻了翻书,找到SELECT这个函数,可以解决问题。

select这个函数可以设置读写的阻塞时间(当然也可以设成永久阻塞)

以下是一个简单的代码:

  1. #include <unistd.h>   
  2.   
  3. int main()  
  4. {  
  5.         int nread;  
  6.         char buffer[128];  
  7.         fd_set inputs;  
  8.   
  9.         FD_ZERO(&inputs);  
  10.         FD_SET(0,&inputs);  
  11.   
  12.   
  13.         select(FD_SETSIZE, &inputs, NULL, NULL, NULL);  
  14.         printf("aaaaaa\n");  
  15.         nread = read(0,buffer,sizeof(buffer));  
  16.         buffer[nread] = '\0';  
  17.         printf("%s",buffer);  
  18.   
  19. }  
  20. ~                                                                                 
  21. ~    

运行以后不输入任何东西就会阻塞在SELECT这一行,直到输入数据程序才往下运行。

当然也可以设置阻塞的时间

  1. #include <sys/time.h>   
  2. #include <stdio.h>   
  3. #include <stdlib.h>   
  4. #include <unistd.h>   
  5.   
  6. int main()  
  7. {  
  8.         int nread;  
  9.         char buffer[128];  
  10.         fd_set inputs;  
  11.         struct timeval timeout;  
  12.   
  13.         FD_ZERO(&inputs);  
  14.         FD_SET(0,&inputs);  
  15.   
  16.   
  17.         timeout.tv_sec = 2;//2秒   
  18.         timeout.tv_usec = 500000;//0.5秒   
  19.         /*加起来是2.5秒*/  
  20.   
  21.   
  22.         select(FD_SETSIZE, &inputs, NULL, NULL, &timeout);  
  23.         printf("aaaaaa\n");  
  24.         nread = read(0,buffer,sizeof(buffer));  
  25.         buffer[nread] = '\0';  
  26.         printf("%s",buffer);  
  27.   
  28. }  

这样就会阻塞2.5秒后往下执行了!

相关内容