Linux中不同进程同一个端口,linux系统实现多个进程监听同一个端口
通过 fork 创建子进程的方式可以实现父子进程监听相同的端口。
方法:在绑定端口号(bind函数)之后,监听端口号之前(listen函数),用fork()函数生成子进程,这样子进程就可以克隆父进程,达到监听同一个端口的目的。
# 代码示例:一主一子
import socket
import select
import sys
import struct
import os
import time
if __name__ == '__main__':
pid = os.getpid()
s1 = socket.socket() # 创建 socket 对象
# host = socket.gethostname() # 获取本地主机名
host = '127.0.0.1'
port1 = 12346 # 设置端口号
# port2 = 12347
# --关键代码--
s1.bind((host, port1))
pid1 = os.fork()
print("我会被主子进程分别执行一次")
# 也可以分别写到分子进程里
s1.listen(5)
# --关键代码--
while True:
if pid1 == 0:
# s1.listen(5)
print("子进程")
socket1, addr1 = s1.accept()
print(addr1)
socket1.send("子进程响应".encode('utf-8'))
socket1.close()
print('结束服务端子进程')
else:
# s1.listen(5)
print("主进程")
socket2, addr2=s1.accept()
print(addr2)
socket2.send("主进程响应".encode('utf-8'))
socket2.close()
print('结束服务端主进程')
# 代码示例:一主多子
import socket
import select
import sys
import struct
import os
import time
if __name__ == '__main__':
pid = os.getpid()
s1 = socket.socket() # 创建 socket 对象
# host = socket.gethostname() # 获取本地主机名
host = '127.0.0.1'
port1 = 12346 # 设置端口号
# port2 = 12347
s1.bind((host, port1))
pid1 = os.fork()
# s1.listen(5)
print("我会被主子进程分别执行一次")
while True:
if pid1 == 0:
s1.listen(5)
print("子进程1")
socket1, addr1 = s1.accept()
print(addr1)
socket1.send("子进程响应1".encode('utf-8'))
socket1.close()
print('结束服务端子进程1')
elif pid1 != 0:
pid2 = os.fork()
if pid2 == 0:
s1.listen(5)
print("子进程2")
socket2, addr2 = s1.accept()
print(addr2)
socket2.send("子进程响应2".encode('utf-8'))
socket2.close()
print('结束服务端子进程2')
else:
s1.listen(5)
print("主进程")
socket2, addr2 = s1.accept()
print(addr2)
socket2.send("主进程响应".encode('utf-8'))
socket2.close()
print('结束服务端主进程')
# 试想下子进程还有子进程的写法和用法
惊群现象
当连接到来时,子进程、父进程都可以 accept, 这就是著名的“惊群”问题(thundering herd problem)。
应用多进程多线程模型
一直疑惑一个应用app如何才能以多进程,多线程的方式运行。对于多线程可能很好理解,我们只要在进程中启用多线程的模式即可。也就是来一个请求,我们就用函数pthread_create()启用一个线程即可。这样我们的应用就可以在单进程,多线程的模式下工作。
一个应用app通常工作在多进程,多线程的模式下,它的效率是最高的。那么我们如何才能做到多进程模式呢?经验告诉我们,如果多次启动一个进程会报错:“Address already in use!"。这是由于bind函数导致的,由于该端口号已经被监听了。
fork原理
fork时,子进程复制一份父进程的资源。然后父子进程分别执行os.fork()之后的程序
子进程中fork函数返回0,父进程中返回子进程的pid
Python的os.fork()是一个会返回两次的函数
通过linux内核的SO_REUSEPORT选项实现多个进程监听相同的端口
# reuseport.py代码
import socket
import os
#xiaorui.cc
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
s.bind(('0.0.0.0', 1234))
s.listen(1)
while True:
conn, addr = s.accept()
print('Connected to {}'.format(os.getpid()))
data = conn.recv(1024)
conn.send(data)
conn.send(str(os.getpid()))
conn.close()
# 启动多个进程
nohup python reuseport.py &
nohup python reuseport.py &
nohup python reuseport.py &
# 使用nc测试,可以得到随机的一个进程响应
echo "xiaorui" | nc localhost 1234
# 使用socat(nc的增强版)测试,可以得到随机的一个进程响应
echo "ss" | socat - tcp-connect:localhost:1234
linux 系统下开机自动启动oracle 监听和实例 (亲测有效)
[oracle@oracle11g ~]$ dbstartORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listene ...
linux: 获取监听指定端口的进程PID
在 linux 下经常需要杀死(重启)监听某端口的进程, 因此就写了一个小脚本, 通过 ss 命令获取监听制定端口的进程 PID, 然后通过 kill 命令结束掉进程: #!/bin/sh # set ...
[Linux] 多进程网络编程监听一个端口
SO_REUSEPORT支持多个进程或者线程绑定到同一端口 每个进程可以自己创建socket.bind.listen.accept相同的地址和端口,各自是独立平等的.让多进程监听同一个端口,各个进程中 ...
linux系统中,查看当前系统中,都在监听哪些端口
需求描述: 查看当前系统中都监听着哪些的端口,用netstat命令,在此记录下 操作过程: 1.查看系统中都在监听哪些端口 [root@testvm home]# netstat -ntl Activ ...
Linux中安装Oracle11g后出现监听的问题及解决办法
软件安装: 参考文章: linux安装Oracle11G 错误如下: [oracle@iz2f570bi1k56uz admin]$ lsnrctl start LSNRCTL for Linux: ...
Linux下启动Oracle服务和监听程序步骤
Linux下启动Oracle服务和监听程序启动和关闭步骤整理如下: 1.安装oracle: 2.创建oracle系统用户: 3./home/oracle下面的.bash_profile添加几个环境变量 ...
Linux下的启动oracle服务 启动监听 开放端口操作
尝试登录oracle 使用root用户将没有sqlplus命令 [root@localhost ~]# sqlplus /nolog bash: sqlplus: 未找到命令... [root ...
获取Windows下某进程监听的TCP/UDP端口
1.在Windows下用CMD netstat命令可以获得当前进程监听端口号的信息,如netstat -ano可以看到IP.port.状态和监听的PID. 那么可以执行CMD这个进程得到监听的端口号信 ...
Linux 使用NC命令永久监听本地端口
感谢: 冰点阳光 Linux可以使用nc命令来测试网络端口是否正常,类似于telnet命令,但也可以用nc命令来监听本地端口,支持TCP.UDP协议,当我们测试NTP服务网络策略是否正常时,可以使用到 ...
随机推荐
NOIP 考前 数论复习
POJ 2891 x=r1 (mod a1) x=r2 (mod a2) x=a1*x+r1,x=a2*y+r2; a1*x-a2*y=r2-r1; 用Extend_Gcd求出m1*x+m2*y=d; ...
mysql数据库字符集的设置
my.ini文件中clinet和mysqld中的写法不一样,要注意 [client] port=3306 default-character-set=utf8 [mysqld] ...
csuoj 1503: 点到圆弧的距离
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 1503: 点到圆弧的距离 时间限制: 1 Sec 内存限制: 128 MB Speci ...
(1)java虚拟机概念和结构图
java虚拟机解构图一 java虚拟机解构图二 java虚拟机结构图三 [1]类加载系统 --->负责从文件系统或网络中加载class信息,存放至方法区的内存空间[2]java堆 ...
深入了解epoll (转)
一. 介绍 Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性.传统的select以及poll的效率会因为 socket数量的线形递增而导致呈二次乃 ...
candy(动态规划)
题目描述 There are N children standing in a line. Each child is assigned a rating value. You are giving ...
Java六大必须理解的问题
Java六大必须理解的问题 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列.内容 ...
纯CSS打造萌萌哒大白
HTML部分:
BeautifulSoup4----利用find_all和get方法来获取信息
中文文档 官方教学网页源码:
Page title
jQuery设置内容和属性方
何问起 hovertree.com 设置内容 - text().html() 以及 val()text() - 设置或返回所选元素的文本内容html() - 设置或返回所选元素的内容(包括 HTML ...
Linux中不同进程同一个端口,linux系统实现多个进程监听同一个端口相关推荐
- linux监听一个端口命令,linux监听端口命令
在linux系统下,我们可以通过相关的命令监听端口的状态.下面由学习啦小编为大家整理了linux监听端口命令的相关知识,希望对大家有所帮助. 一.linux监听端口命令--nc命令详解 语法 nc [ ...
- 单个进程监听多个端口及多个进程监听同一个端口
单个进程监听多个端口 单个进程创建多个 socket 绑定不同的端口,TCP, UDP 都行 多个进程监听同一个端口(multiple processes listen on same port) 方 ...
- Linux 使用NC命令永久监听本地端口
Linux可以使用nc命令来测试网络端口是否正常,类似于telnet命令,但也可以用nc命令来监听本地端口,支持TCP.UDP协议. 使用案例如下: 1.测试TCP端口 nc -vz ip tcp-p ...
- Tomcat(1)介绍、jdk安装、安装Tomcat 配置Tomcat监听80端口
Tomcat介绍 (使用yum 下载安装的openjdk下载以后就可以使用) 以下实验用的是在官网下载程序包. Tomcat是一个中间键,要解析java相关的东西,需要先下载JDK 下载jdk 1.下 ...
- linux中_Linux基础知识(Linux系统、Linux中的链表)
Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...
- 在linux中查看nginx端口监听,Nginx端口监听(listen指令)
本节主要来介绍 Nginx 中与端口监听有关的配置指令,下表为端口监听指令及其相关说明. 名称 端口监听指令 指令 listen 作用域 server 默认值 listen*:80 或 *:8000 ...
- 如何多个进程监听同一个端口
1. 问题描述 一个进程监听端口,经验告诉我们,如果多次启动一个进程会报错:"Address already in use!".这是由于bind函数导致的,由于该端口号已经被第一个 ...
- centos sudo不能运行_如何在 Linux 中配置 sudo 访问权限 | Linux 中国
Linux 系统中 root 用户拥有 Linux 中全部控制权力.Linux 系统中 root 是拥有最高权力的用户,可以在系统中实施任意的行为.-- Magesh Maruthamuthu Lin ...
- 19. linux中权限详解,Linux权限位,读写执行权限真正含义,chmod详解
linux中权限详解,Linux权限位,读写执行权限真正含义,chmod详解 文章目录 Linux权限位 读写执行 三种权限真正含义和作用 权限对文件的作用 权限对目录的作用 示例 chmod 使用数 ...
最新文章
- CMOS及CCD感光sensor的主要技术参数解析
- mysql的存储引擎种类,mysql 存储引擎,基本数据类型
- 【XSY3048 】Polynominal 数学
- linux 安装u盘win7系统安装教程,centos u盘安装 boot制作u盘win7盘工具
- shell脚本检查进程脚本
- 大数据之-Hadoop之HDFS_HDFS的内容介绍---大数据之hadoop工作笔记0047
- 智慧楼宇管理运营端app、运维管理、工单管理、报修管理、维保管理、巡检查询、巡检管理、能源管理、维保查询、智慧社区、巡检统计、工单统计、能源管理、智能楼宇、设备监控、智能社区、系统运营、楼宇运维小程序
- python in visual studio
- 信用评分卡 (part 6 of 7)
- 北航计算机学院复试流程,2018北航计算机考研复试经验
- 复杂截面抗扭惯矩计算
- 学习weka(1):weka软件安装使用教程
- echarts 折线图 中有两条线 ,在鼠标悬停时显示数据
- 谈谈多年的创业之路和网络生涯
- Vue项目JS脚本错误捕获
- 蓝桥杯 第39级台阶
- HDU - 1573 X问题
- 别傻傻分不清docker run 和 start 的区别了
- 网络基本概念之TCP, UDP, 单播(Unicast), 组播(Multicast)
- 小米路由器linux界面,小米路由器配置ssh登录方法 | 192.168.1.1登陆页面