`

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

    linux多线程编程

    linux多线程编程 声明:本文是网上整理的资料,版权属其作者本人所有。 1 第一章 线程基础知识 2 一.什么是线程 2 二.线程的优点 2 三.线程的缺点 2 四.线程的结构 2 五.线程标识 2 六.线程的创建 3 七..线程...

    echoserver多进程版

    我们的echo服务器最大的缺点就是无法支持多客户连接,即使客户端能够连接到服务器上,服务器也不为该客户做服务,(直接没什么反应),虽然链接是有的(也就是说,客户端是已经连接到服务器上的了,但是服务器就是不搭理你......

    linux下基于setitimer高精度多通道软件定时器

    基于Linux环境下的setitimer的延时/定时器的使用, setitimer 在同一个进程中只能使用一个的缺点,作为一个嵌入式的开发人员总觉得有点说不出的苦恼,那么本资源即为基于linux环境的一些函数,编写一个满足基本要求...

    Linux网络编程 视频 教程

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输...

    一个进程池的服务器程序

    if (write_pid() ) //避免同时有多个该程序在运行 return -1; if (pipe(fd1) ) { perror("pipe failed"); exit(-1); } if (s_pipe(fd2) ) { perror("pipe failed"); exit(-1); } int port = atoi(argv...

    Linux网络编程超级详细笔记

    网络通信模型:Linux支持多种网络通信模型,包括阻塞式和非阻塞式通信、多路复用、信号驱动等。需要了解不同的通信模型的优缺点和使用方式。 网络编程库:Linux下有多种网络编程库,包括libnet、libpcap等。这些库...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    Linux程序设计 第4版.haozip01

    12.2 线程的优点和缺点 417 12.3 第一个线程程序 418 12.4 同时执行 421 12.5 同步 423 12.5.1 用信号量进行同步 423 12.5.2 用互斥量进行同步 427 12.6 线程的属性 431 12.7 取消一个线程 435 12.8 多线程 ...

    Linux环境数据库管理员指南

    3.5.2 后台进程 67 3.5.3 创建帐号 68 3.5.4 SQL*Plus 70 3.5.5 数据字典 72 3.5.6 导入/导出 73 3.6 第三方软件 73 3.6.1 Orasoft 73 3.6.2 Orac 75 3.6.3 Perl/DBI 76 3.7 小结 76 3.8 常见问答 76 第4章 在Linux...

    C++教程网《Linux网络编程》视频百度云地址

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输...

    c++教程网的linux网络编程视频下载

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输...

    linux系统下多线程编程文档资料

    四、posix有名信号灯应用于多进程 27 五、基于内存的信号灯 29 第四章 互斥量 39 一、什么是互斥锁 39 二、初始化/回收互斥锁 40 三、对互斥量加减锁 40 四、互斥锁属性 45 五、应用互斥量需要注意的几点 48 第五章 ...

    Linux程序设计 第4版.haozip02

    12.2 线程的优点和缺点 417 12.3 第一个线程程序 418 12.4 同时执行 421 12.5 同步 423 12.5.1 用信号量进行同步 423 12.5.2 用互斥量进行同步 427 12.6 线程的属性 431 12.7 取消一个线程 435 12.8 多线程 ...

    linux网络编程

    POSIX消息队列相关函数 POSIX消息队列示例 35POSIX共享内存 POSIX共享内存相关函数 POSIX共享内存示例 Linux网络编程之线程篇 36线程介绍 什么是线程 进程与线程 线程优缺点 线程模型 N:1用户线程模型 1:1核心线程...

    ARM 嵌入式LINUX 系统构建与驱动开发

    2 LINUX 正根的嵌入式系统,LINUX消费与通信领域用的比较多,但缺点是必须ARM9才能跑,ARM9的板子自己做就不行了,6层板太贵。买开发板1K达底吧。但是还是推荐选ARM9+LINUX 3 UCLINUX 算投机嵌入式系统:)ARM7上...

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输...

    Linux中多线程详解及简单实例

    Linux中多线程详解及简单实例 1.概念 进程:运行中的程序。 线程:一个程序中的多个执行路径。更准确的定义是:线程是一个进程内部的一个控制序列。 2.为什么要有线程? 用fork调用进程代价太高,需要让一个...

    ARM入门最好的文章

    1、搞开发,工程设计,用UCOS,小巧,多进程,简单,体现了ARM7的精髓。 2、LINUX 正根的嵌入式系统,LINUX消费与通信领域用的比较多,但缺点是必须ARM9才能跑,ARM9的板子自己做就不行了,6层板太贵。买开发板1K达...

    将数据包与 Linux 系统中的负责进程相关联。通过添加进程信息来诊断连接_C语言_代码_相关文件_下载

    介绍 ============= 在诊断网络上的异常行为时,系统管理员 有两个不同的领域需要关注: 网络(即网络视图),以及包含在 连接到网络的各个主机(即主机视图)。...更多详情、使用方法,请下载后细读README.md文件

Global site tag (gtag.js) - Google Analytics