select的限制

/*
1、select實現併發服務器併發的兩點限制
一、一個進可以打開的最大文件描述符限制。能夠經過兩種方式修改
ulimit -n :獲取最大文件描述符個數
ulimit -n 2048:修改成2048個
另外能夠經過如下程序修改,利用 setrlimit 不能改父進程的限制,只能改當前進程和子進程可以打開的最大文件描述符限制
  int getrlimit(int resource, struct rlimit *rlim); //獲取系統資源限制     要獲取的資源爲RLIMIT_NOFILE
  int setrlimit(int resource, const struct rlimit *rlim); 
  服務器

  struct rlimit {
    rlim_t rlim_cur; // Soft limit
    rlim_t rlim_max; //Hard limit (ceiling for rlim_cur)
  };
二、select中的fd_set集合容量的限制(FD_SETSIZE),修改宏的值,這須要從新編譯內核
*/併發

#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<signal.h>
#include <sys/time.h>

#include <sys/resource.h>
#define ERR_EXIT(m)\
do\
{\
  perror(m);\
  exit(EXIT_FAILURE);\
}while(0)
int main(void)
{
  struct rlimit rl;
  if(getrlimit(RLIMIT_NOFILE,&rl)<0)
    ERR_EXIT("getrlimit");
  printf("%d\n",(int)rl.rlim_max);

  rl.rlim_cur=2048;
  rl.rlim_max=2048;
  if(setrlimit(RLIMIT_NOFILE,&rl)<0)
    ERR_EXIT("setrlimit");
  if(getrlimit(RLIMIT_NOFILE,&rl)<0)
    ERR_EXIT("getrlimit");
  printf("%d\n",(int)rl.rlim_max);

return 0;
}
相關文章
相關標籤/搜索