信号驱动IO的编程模型和多路复用IO的编程模型

//信号驱动IO的编程模型

  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
   
  int   fdqueue[20];  
  int   qsize=0;  
  int   qtail=0;  
  int   lfd;  
  void   signal_handle();  
  void   signal_handle()  
  {  
  int   err;  
  int   i;  
  i=sizeof(err);  
  getsockopt(lfd,SOL_SOCKET,SO_ERROR,&err,&i);  
  if(err)  
  {  
  printf("socket   pending   error:%s/n",strerror(err));  
  return;  
  }  
  if(qsize==20)return;  
  for(;fdqueue[qtail]>=0;)qtail=++qtail   %   20;  
  fdqueue[qtail]=accept(lfd,NULL,NULL);  
  if(fdqueue[qtail]<0)return;  
  qsize++;  
  }  
  int   main()  
  {  
  struct   sockaddr_in   addr;  
  struct   sigaction   act;  
  sigset_t   sus,nes,ols,temp;  
  fd_set   wds;  
  int   maxfd=0;  
  int   i;  
  lfd=socket(AF_INET,SOCK_STREAM,0);  
  i=1;  
  setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));  
  bzero(&addr,sizeof(addr));  
  addr.sin_family=AF_INET;  
  addr.sin_port=htons(8080);  
  addr.sin_addr.s_addr=htonl(INADDR_ANY);  
  bind(lfd,(struct   sockaddr*)&addr,sizeof(addr));  
  act.sa_handler=signal_handle;  
  bzero(&temp,sizeof(temp));  
  act.sa_mask=*(sigset_t   *)NULL;  
  act.sa_flags=0;  
  sigaction(SIGIO,&act,NULL);  
  fcntl(lfd,F_SETOWN,getpid());  
  i=1;  
  ioctl(lfd,FIOASYNC,&i);  
  for(i=0;i<20;i++)  
  fdqueue[i]=-1;  
  listen(lfd,5);  
  FD_ZERO(&wds);  
  sigemptyset(&sus);  
  sigemptyset(&ols);  
  sigemptyset(&nes);  
  sigaddset(&nes,SIGIO);  
  sigprocmask(SIG_BLOCK,&nes,&ols);  
  for(;;)  
  {  
  for(;qsize==0;)sigsuspend(&sus);  
  sigprocmask(SIG_SETMASK,&ols,NULL);  
  for(i=0;i<20;i++)  
  {  
  if(fdqueue[i]!=-1)  
  {  
  FD_SET(fdqueue[i],&wds);  
  maxfd=maxfd>fdqueue[i]?maxfd:fdqueue[i];  
  }  
   
  }  
  select(maxfd+1,NULL,&wds,NULL,NULL);  
  for(i=0;i<20;i++)  
  {  
  if(FD_ISSET(fdqueue[i],&wds))  
  {  
  write(fdqueue[i],"OK!",3);  
  close(fdqueue[i]);  
  sigprocmask(SIG_BLOCK,&nes,&ols);  
  fdqueue[i]=-1;  
  qsize--;  
  }  
  }  
  }  
  }  

 

//多路复用IO的编程模型

什么是I/O多路复用? 

数据通信系统或计算机网络系统中,传输媒体的带宽或容量往往超过传输单一信号的需求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用。I/O多路复用就是输入/输出多路复用

 

 

  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #include    
  #define   SOCKETNAME   "/faculty/rossa/system/mysocket"  
   
  int   main()  
  {  
  char   buf[1024];  
  int   s;  
  int   ns,ns2,len,maxfd,nread;  
  struct   sockaddr_un   name;  
  fd_set   fds;  
  unlink(SOCKETNAME);  
  if((s=socket(AF_UNIX,SOCK_STREAM,0))<0)exit(1);  
  memset(&name,0,sizeof(name));  
  name.sun_family=AF_UNIX;  
  strcpy(name.sun_path,SOCKETNAME);  
  len=sizeof(name.sun_family)+strlen(name.sun_path);  
  bind(s,(struct   sockaddr   *)&name,len);  
  listen(s,5);  
  ns=accept(s,(struct   sockaddr   *)&name,&len);  
  ns2=accept(s,(struct   sockaddr   *)&name,&len);  
  maxfd=(ns>ns2?ns:ns2)+1;  
  while(1)  
  {  
  FD_ZERO(&fds);  
  FD_SET(ns,&fds);  
  FD_SET(ns2,&fds);  
  nread=select(maxfd,&fds,(fd_set   *)0,(fd_set   *)0,(struct   timeval   *)0);  
  if(FD_ISSET(ns,&fds))  
  {  
  nread=recv(ns,buf,sizeof(buf),0);  
  if(nread<1)  
  {  
  close(ns);  
  close(ns2);  
  exit(0);  
  }  
  send(ns2,buf,nread,0);  
  }  
  if(FD_ISSET(ns2,&fds))  
  {  
  nread=recv(ns2,buf,sizeof(buf),0);  
  if(nread<1)  
  {  
  close(ns);  
  close(ns2);  
  exit(0);  
  }  
  send(ns,buf,nread,0);  
  }  
  }  
  }   
 

 

你可能感兴趣的:(信号驱动IO的编程模型和多路复用IO的编程模型)