fork()理解及简单并发服务器应用
来源:互联网 发布:电脑玩cf网络异常 编辑:程序博客网 时间:2024/05/05 23:20
作者 shallway 发表于 二 08, 2010 有1个评论
首先,我觉得有两个容易混淆的地方:
1,fork()函数并不是创建新进程,而是复制当前进程。
2,fork()函数被共享执行,有2种返回值。
========================分割线===================================
对于第一点:
父进程fork()后,子进程完全与父进程相等,包括数据段与代码段。可以理解成,数据段有2份相同的,而代码段只有一份供他们共享。关于如何区分子进程与父进程在第二点讲述。
特别强调“复制”这个概念还有一个原因是因为fork()并不是用于创建新进程的,一般Linux下有两种创建新进程的方法:system()与exec()。
system()的底层是exec(),它会重新启动一个shell来执行新进程;exec()是替换当前进程为新进程。
如果用exec()创建新进程,那么必须配合fork()先复制一份进程,再调用exec()将复制品替换掉。、
补充:Linux下的进程是很廉价的,多进程常常比多线程更加方便,关于他们的异同,最主要的就是在多线程中,数据段是共享的,而多进程中,正如上面所述,独立性很高。
对于第二点:
由于子进程与父进程代码段是共享的,所以这点与多线程相同,创建子进程后,马上执行相同的函数,自然子进程也会执行fork()函数,但是并不创建新进程且返回值与父进程不同,这就是区分子进程与父进程的办法。
========================分割线===================================
一个例子:简单多进程并发服务器框架:
pid_t pid;int listenfd, connfd;listenfd = Socket( ... ); /* fill in sockaddr_in{} with server's well-known port */Bind(listenfd, ... );Listen(listenfd, LISTENQ);for ( ; ; ) { connfd = Accept (listenfd, ... ); /* probably blocks */ if( (pid = fork()) == 0) {#2 Close(listenfd); /* child closes listening socket */ doit(connfd); /* process the request */ Close(connfd); /* done with this client */ exit(0); /* child terminates */ }#1 Close(connfd); /* parent closes connected socket */}
以上只是一个框架,很多代码都简化了,可以看出fork()的常规使用方法:if( (pid = fork()) == 0) 的代码块为子进程才能执行的区域。另外特别需要注意的是,listenfd与connfd被close两次,这是必须的,因为系统对套接字的使用是计数的,当计数为0时才真正关闭。又因为父进程只关心listenfd,所以在父进程区域内,必须关闭connfd(#1处);子进程只关心connfd,所以在子进程区域内,必须关闭listenfd(#2处)。
另外补充一点,socket的close()采用计数,当计数为0才发送FIN,但是shutdown()函数可以不管计数,直接发送FIN。显然这里不能用shutdown()。
- fork()理解及简单并发服务器应用
- fork()理解及简单并发服务器应用
- fork原理及服务器应用
- LINUX 并发服务器 fork
- fork并发服务器
- 简单理解web服务器和应用服务器(web容器)
- Strategry模式简单理解及应用
- Redis的理解及简单应用
- Spring AOP 简单理解及应用
- 简单的并发服务器
- 简单的并发服务器
- Linux socket通信——并发服务器(fork)
- linux网络编程fork并发处理的服务器
- linux(一)------多进程并发服务器实现(fork)
- 聊聊Linux fork多进程并发服务器模型
- 高并发的简单理解
- 20 --HTTP协议的简单理解及应用
- MapReduce初步理解及一些简单计算应用
- xss漏洞简要分析
- 图像二值化算法总结
- 卡尔曼滤波的原理说明
- SWT GridLayout
- java判断服务器是那种,例如区分tomcat和weblogic
- fork()理解及简单并发服务器应用
- 【POJ1953】World Cup Noise(动态规划,斐波那契数列)
- JFace TreeViewer使用
- bat 文件在windowsXP和Windows7 上的一点区别
- python 编码转换
- C#中几个基础控件属性介绍
- IE6中submit标题提交问题
- 算法复杂度的计算
- NO.60 Oracle 快速将某用户所有table的select权限授权给另一用户