您的位置:首页 > 编程语言

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

2009-10-26 19:58 387 查看
//信号驱动IO的编程模型

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>

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 <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdio.h>
#include <sys/un.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: