code_tin

从头编写高性能服务程序2-双进程阻塞
上一个模型的缺点就是 当链接数据没被处理完时, 整个服务是无法处理新链接的 这种比较适合单词处理速度很快 而且并发...
扫描右侧二维码阅读全文
29
2010/01

从头编写高性能服务程序2-双进程阻塞

上一个模型的缺点就是
当链接数据没被处理完时,
整个服务是无法处理新链接的
这种比较适合单词处理速度很快
而且并发量=0的服务
也就是服务端和客户端1:1的样子
我丢给你请求,你给我数据,我再给你请求

这对于一个比较高性能的服务肯定是不可接受的
所以我们产生了一个想法
用父子进程,父进程管listen
有链接进来就fork一个子进程
子进程accept之后去处理.处理完之后就退出
注意,下面这段代码还是没close
所以上面所说的只能是做了一半
大家理解概念就好

#include #include #include #include #include int main(){ int listen_fd,accept_fd,flag; struct sockaddr_in my_addr,remote_addr; if ( (listen_fd = socket( AF_INET,SOCK_STREAM,0 )) == -1 ){ perror("create socket error"); exit(1); } if ( setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,(char *)&flag,sizeof(flag)) == -1 ){ perror("setsockopt error"); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(3389); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); if ( bind( listen_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in)) == -1 ) { perror("bind error"); exit(1); } if ( listen( listen_fd,1 ) == -1 ){ perror("listen error"); exit(1); } int pid; pid=fork(); for(;;){ if( pid==0 ){ int addr_len = sizeof( struct sockaddr_in ); accept_fd = accept( listen_fd, (struct sockaddr *)&remote_addr,&addr_len ); for(;;){ char in_buf[1024]; memset(in_buf, 0, 1024); recv( accept_fd ,&in_buf ,1024 ,0 ); printf( "accept:%s\n", in_buf ); } } else{ //do nothing } } return 0; }

fork产生子进程之后返回值
如果是0,那么这个进程就是子进程
如果-1,就是错误
否则就是产生子进程的pid,可以用这个pid来控制子进程,比如kill掉

大家实际用起来会发现和单进程阻塞一样
只能处理一个客户端连接.根本没好处么
呵呵.其实只是演示一下fork
然后好处还是有的.如果子进程因为处理request而挂了
主进程可以控制,然后再产生一个
所以这种样子比单进程要可靠一点
一个干活.一个监控

那么下一步就是对应每个链接产生进程

Last modification:November 26th, 2018 at 04:16 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment