fork有一些副作用,其中最明显的就是重复的文件描述符。比如,socket, 磁盘上的文件,终端(标准输入、输出,错误)或某些其他文件类对象。
因为一个进程的fork是一个准确的拷贝,它继承了父进程的所有文件描述符和socket,所以就可能遇到这样一个情况,那就是父进程和子进程对于一个单一的远程主机,都有一个开放的连接.
这并不好,有几个原因,如果两个进程都视图通过socket通信,结果就可能混淆。另外一点是,两个进程都要调用 close() ,连接才能真正被关闭。因此,一些协议中,使用关闭socket作为某些操作结束信号的情况会出现问题。除非父进程和子进程都关闭了。
这个问题的解决办法是在fork之后,只要进程不用 socket的时候就马上关闭它。
#!/usr/bin/env python
#!coding=utf-8
"""
forking 服务器
多进程服务器
"""
import socket ,traceback, os,sys
import time
def reap():
print "in reap"
"""
处理子进程
"""
while 1:
try:
print "in reap ,pid=%s"%(getpid())
result = os.waitpid(-1 , os.WNOHANG) # -1 表示等待所有的子进程结束,作用相当于调用wait ,WNOHANG表示不使父进程挂起,而立即返回
print "000000000000000"
if not result[0]:
break
except:
break
print "reaped child process %d" % result[0]
def getpid():
return os.getpid()
host=''
port=9002
s =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(1)
print "parent at %d listening for connection" % getpid()
if __name__ == "__main__":
while 1:
try:
print "accept , pid= %s"%(getpid())
clientsock , clientaddr = s.accept()
print "start accpet"
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
continue
#reap()
pid = os.fork()
print "*****************"
if pid:
#子父进程中
#this is the parent process .close the child's socket
print "in parent socket"+str(clientsock)
print "in parent port=%s"%str(port)
print "in parent s=%s"%str(s)
"""
这里为什么要关闭clientsock呢,这里解释(this is the parent process .close the child's socket)
关闭的是子线程的socket,我觉得是写错了,
应该关闭的是父进程的client的socket连接,因为这里是在父进程里面,这里为什么要关闭呢,
因为多进程是, 子进程会复制父进程的数据,那么这样clientsocket,就会存在2次饮用(父进程一个,
子进程一个) ,如果每创建一次子进程都增加一次引用的话,这样就会消耗系统的资源,所以这里应该关闭
"""
clientsock.close()
#s.close()
print "in parent socket"+str(clientsock)
continue
else:
#在子进程中
#from here on . this is child
#clientsock.close()
print "in child socket"+str(clientsock)
print "in child port=%s"%str(port)
print "in child s=%s"%str(s)
"""
子进程里面也有s, 父进程也有s,如果这时候,客户端有连接的话,就有可能出现混乱的情况,所以这里选择关闭
子进程的s
"""
s.close()
#process the connection
try:
print "child from %s being handled bu pid %d"%\
(clientsock.getpeername(), os.getpid())
#不停的循环接收数据
while 1:
data = clientsock.recv(4096)
print str(data) + " , pid = %s"%(getpid())
if not len(data):
break
clientsock.sendall(data)
except(KeyboardInterrupt, SystemExit):
raise
except:
traceback.print_exc()
#close the connection
try:
print "断开连接 ,pid=%s"%(getpid())
clientsock.close()
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
print "进程结束,pid=%s"%(getpid())
sys.exit(0)
相关推荐
嵌入式Linux多进程应用程序的设计与实现 本文介绍了进程的概念,比较了多进程和多线程的优缺点,并讨论了多进程在Linux系统下的程序设计和实现。通过对多进程和多线程的比较,文章指出在实际编程中应该根据情况选择...
在给定的标题“易语言linux多进程tcp服务器源码”中,我们可以看到这个资源是用易语言在Linux环境下编写的,实现了TCP(Transmission Control Protocol)服务器功能,它支持多进程并发处理客户端连接,这是一种常见...
【Linux进程间通信】是操作系统中进程协作的重要方式,它允许...理解并熟练掌握这些技术,对于开发多进程应用和优化系统性能至关重要。在实际开发中,开发者需要根据需求选择合适的通信机制,确保进程间的安全协作。
多进程和多线程各有优缺点。多进程具有更好的资源隔离性,进程崩溃不会影响其他进程,但进程间的通信成本较高;多线程则可以充分利用CPU缓存,提高效率,但必须注意同步问题,以避免数据不一致。在选择多进程还是多...
在Linux操作系统中,进程通信是实现多进程协作和数据交换的关键技术。本文将详细阐述Linux下的八种进程通信方法,帮助读者理解并掌握这些技术。 1. **管道(Pipe)**: 管道是一种半双工通信方式,允许一个进程...
在Linux操作系统中,...总的来说,了解和掌握Linux下的进程通信技术对于提升编程技能,特别是在开发分布式系统和多进程应用时,具有极其重要的意义。通过实践和研究,你不仅可以巩固理论知识,还能提高问题解决能力。
然而,多进程并发也存在一些缺点。首先,创建和管理进程的开销相对较大,包括内存分配、上下文切换等,这可能影响系统的整体性能。其次,进程间的通信(IPC,Inter-Process Communication)相比线程间的通信更为复杂...
【Linux下的多进程编程初步】 Linux操作系统以其强大的多任务处理能力而闻名,这主要得益于其对多进程和多线程编程的良好支持。在Linux中,多进程编程是实现并发执行和资源隔离的重要手段,而多线程编程则可以提高...
同时,Linux支持多线程,即一个进程可以包含多个执行流,共享同一地址空间,提高资源利用率和程序并发性。 进程调度是Linux内核中的重要功能,它的主要任务是决定哪个进程应当获得CPU的执行权。Linux采用多种调度...
为了实现多进程同时实施,Linux 使用了进程调度(process scheduling)机制。进程调度是指操作系统为每个进程分配一定的运行时间,然后根据某种规则从众多进程中挑选一个投入运行。 本文首先对 Linux 系统进行了...
8. **多进程优缺点**: - **优点**:资源隔离,一个进程崩溃不影响其他进程,适合大规模并行计算。 - **缺点**:进程间通信复杂,开销大,不适合频繁交互。 9. **并发执行**:多进程可以同时运行在多核处理器上,...
本文将深入探讨Linux环境下的各种进程间通信机制,包括它们的工作原理、使用场景以及优缺点。 首先,最基本的进程间通信方式是管道(Pipe)。管道是一种半双工的通信方式,数据只能单向流动,且只能在具有亲缘关系...
在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是实现多个独立运行的程序协同工作的重要手段。...通过学习和理解这些技术,我们可以更好地设计和实现多进程系统,提高软件的并发性和可扩展性。
1)管道 管道分为有名管道和无名管道 ...信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访
在Linux操作系统中,进程间的通信(IPC,Inter-Process Communication)是系统编程的重要部分,它允许不同的进程共享数据和协调工作。在这个场景中,我们关注的是消息队列,这是一种允许两个或多个进程之间异步传递...
- **应用场景**:当需要实现多进程间的通信,并且对数据的格式有特殊要求时使用。 ##### 3. 信号量 - **定义**:信号量主要作为进程间同步的手段,用于解决多个进程访问同一资源的冲突问题。 - **特点**:信号量不...
Linux系统中进程间通信(Inter-Process Communication, IPC)是一个重要的概念,其允许运行在同一个系统上的不同进程之间进行数据交换。共享内存是一种高效的IPC机制,它允许多个进程共享一块给定的存储区,从而实现...