`

linux 多进程 缺点

 
阅读更多

 

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多进程应用程序的设计与实现 (1).pdf

    嵌入式Linux多进程应用程序的设计与实现 本文介绍了进程的概念,比较了多进程和多线程的优缺点,并讨论了多进程在Linux系统下的程序设计和实现。通过对多进程和多线程的比较,文章指出在实际编程中应该根据情况选择...

    易语言linux多进程tcp服务器源码

    在给定的标题“易语言linux多进程tcp服务器源码”中,我们可以看到这个资源是用易语言在Linux环境下编写的,实现了TCP(Transmission Control Protocol)服务器功能,它支持多进程并发处理客户端连接,这是一种常见...

    linux进程间通信ppt

    【Linux进程间通信】是操作系统中进程协作的重要方式,它允许...理解并熟练掌握这些技术,对于开发多进程应用和优化系统性能至关重要。在实际开发中,开发者需要根据需求选择合适的通信机制,确保进程间的安全协作。

    multisum_nowmnh_C语言_多进程_多线程linux_

    多进程和多线程各有优缺点。多进程具有更好的资源隔离性,进程崩溃不会影响其他进程,但进程间的通信成本较高;多线程则可以充分利用CPU缓存,提高效率,但必须注意同步问题,以避免数据不一致。在选择多进程还是多...

    Linux下进程通信的八种方法.docx

    在Linux操作系统中,进程通信是实现多进程协作和数据交换的关键技术。本文将详细阐述Linux下的八种进程通信方法,帮助读者理解并掌握这些技术。 1. **管道(Pipe)**: 管道是一种半双工通信方式,允许一个进程...

    linux下进程通信实例

    在Linux操作系统中,...总的来说,了解和掌握Linux下的进程通信技术对于提升编程技能,特别是在开发分布式系统和多进程应用时,具有极其重要的意义。通过实践和研究,你不仅可以巩固理论知识,还能提高问题解决能力。

    TCP多进程并发TCP多进程并发

    然而,多进程并发也存在一些缺点。首先,创建和管理进程的开销相对较大,包括内存分配、上下文切换等,这可能影响系统的整体性能。其次,进程间的通信(IPC,Inter-Process Communication)相比线程间的通信更为复杂...

    Linux下的多进程编程初步.doc

    【Linux下的多进程编程初步】 Linux操作系统以其强大的多任务处理能力而闻名,这主要得益于其对多进程和多线程编程的良好支持。在Linux中,多进程编程是实现并发执行和资源隔离的重要手段,而多线程编程则可以提高...

    linux内核简介,进程管理,进程调度等等

    同时,Linux支持多线程,即一个进程可以包含多个执行流,共享同一地址空间,提高资源利用率和程序并发性。 进程调度是Linux内核中的重要功能,它的主要任务是决定哪个进程应当获得CPU的执行权。Linux采用多种调度...

    Linux操作系统专业课程设计方案报告基于Linux的进程调度模拟程序.docx

    为了实现多进程同时实施,Linux 使用了进程调度(process scheduling)机制。进程调度是指操作系统为每个进程分配一定的运行时间,然后根据某种规则从众多进程中挑选一个投入运行。 本文首先对 Linux 系统进行了...

    多进程的实现

    8. **多进程优缺点**: - **优点**:资源隔离,一个进程崩溃不影响其他进程,适合大规模并行计算。 - **缺点**:进程间通信复杂,开销大,不适合频繁交互。 9. **并发执行**:多进程可以同时运行在多核处理器上,...

    linux环境进程间通信

    本文将深入探讨Linux环境下的各种进程间通信机制,包括它们的工作原理、使用场景以及优缺点。 首先,最基本的进程间通信方式是管道(Pipe)。管道是一种半双工的通信方式,数据只能单向流动,且只能在具有亲缘关系...

    Linux环境进程间通信技术

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是实现多个独立运行的程序协同工作的重要手段。...通过学习和理解这些技术,我们可以更好地设计和实现多进程系统,提高软件的并发性和可扩展性。

    浅谈Linux进程间通信方式及优缺点

    1)管道 管道分为有名管道和无名管道 ...信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访

    linux两不同进程用消息队列通信

    在Linux操作系统中,进程间的通信(IPC,Inter-Process Communication)是系统编程的重要部分,它允许不同的进程共享数据和协调工作。在这个场景中,我们关注的是消息队列,这是一种允许两个或多个进程之间异步传递...

    Linux进程间通信

    - **应用场景**:当需要实现多进程间的通信,并且对数据的格式有特殊要求时使用。 ##### 3. 信号量 - **定义**:信号量主要作为进程间同步的手段,用于解决多个进程访问同一资源的冲突问题。 - **特点**:信号量不...

    Linux进程间通信之共享内存

    Linux系统中进程间通信(Inter-Process Communication, IPC)是一个重要的概念,其允许运行在同一个系统上的不同进程之间进行数据交换。共享内存是一种高效的IPC机制,它允许多个进程共享一块给定的存储区,从而实现...

Global site tag (gtag.js) - Google Analytics