【Linux】 TCP短服务编写和守护进程

文章目录

  • TCP 短服务编写流程
  • 进程组和会话和守护进程

TCP 短服务编写流程

  TCP服务器是面向连接的,客户端在发送数据之前需要先与服务器建立连接。 因此,TCP服务器需要能够监听客户端的连接请求。为了实现这一功能,需要将TCP服务器创建的套接字设置为监听状态,以便等待和处理客户端的连接请求。服务器在完成监听工作后,才算初始化完成。
  客户端在创建套接字后,使用 connect 函数向服务器发起连接请求,而服务器通过 accept 函数来获取客户端发来的连接请求。连接成功后,服务器和客户端才开始通信。

监听:int listen(int sockfd, int backlog);
   sockfd 为监听文件描述符。backlog 参数限制了在服务器还没有来得及接受的连接请求,可以在队列中排队等待的最大数量。当达到这个数量时,超出的连接请求将被丢弃。函数调用成功返回0,失败返回 -1,并设置错误码。

发起连接:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
   客户端发起连接请求需要知道服务器的信息,因此 sockaddr 存放的服务器 IP 和 Port 信息。函数调用成功返回0,失败返回 -1,并设置错误码。

接收连接:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
   服务器接收请求需要记录客户端的信息,以便数据发回,因此 sockaddr 存放的服务器 IP 和 Port 信息。函数调用失败返回 -1,并设置错误码。调用成功,返回一个新的套接字描述符,这个返回的描述符和前面传入的 sockfd 不同,传入的 sockfd 是专门用来获取连接,可以称之为监听描述符。而返回的文件描述符,是为给服务器与每个客户端之间提供一条独立的、专用的通信信道,确保数据传输的隔离性和完整性。这样,即使服务器同时处理多个客户端,每个连接也能稳定地进行数据交换,互不干扰。

   由上面我们可以推出,TCP 服务器一定不能是单进程的,因为它要同时服务多个客户端,不然一个客户端连接之后,其它的连接只能阻塞住,等待第一个连接结束。而如果是多进程的服务器,客户端连接增多,系统资源消耗会非常大。对此,我们推荐使用多线程或者线程池来提供服务,如果是服务器给客户端提供的是长服务,那么多线程和线程池区别不大。而现在我们写的服务器提供的是短服务,使用线程池,就能避免线程多次的创建、销毁开销,提高效率。

进程组和会话和守护进程

   一个理想的服务器不应该放在前台,还可以让我们使用 Ctrl + C 或者发送其它信号终止,对此我们应该忽略一些信号如 SIG_PIPE,避免因为客户端关闭,服务器写回客户端失败而产生的进程终止,对具体的信号要进行具体的分析。对此我们应该将服务器放到后台,同时还得保证它不受终端登录或者注销的影响,对此我们要将它守护进程化。

进程组和会话
  在现实生活中,我们经常需要团队合作来完成一项任务。通常,这个团队会有一个领导者,我们称之为组长。即使团队里只有一个人,那个人也会承担组长的角色。在计算机的网络编程中,任务是由一个进程组完成的,组长的PID就是这个进程组PGID的组ID。我们平常编程中,进程组里面只有一个进程,所以我们感受不到。
  一个或者多个进程组构成一个会话 SID,这个会话退出以后,它里面的所有进程组都会退出。如果我们让一个进程,自己构成一个进程组自己构成一个新会话, 它的 PID和PGID和SID 相同,且不会再受到原来这个会话的登录注销影响。这样的进程,我们称之为守护进程。

  我们可以使用 pid_t setsid(void);函数使得调用进程成为一个新的会话领导者,并且不会受到终端的控制。同时需注意:规定进程组组长不能调用 setsid() 函数来创建一个新的会话,对此调用前我们可以 fork() 一下,然后关闭父进程,让子进程成为守护进程即可。

  守护进程一般以d结尾,由于守护进程不会与任何终端交互,我们将它的标准输入、标准输出和标准错误都重定向到 /dev/null。它是一个特殊的设备文件,它会丢弃所有写入其中的数据,读取它会立即返回文件结束(EOF)。通过重定向这些文件描述符,来确保守护进程不会意外地接收或发送任何用户输入或输出。

Linux自带生成守护进程的接口:int daemon(int nochdir, int noclose);
   参数 nochdir为0,则将当前工作目录切换到根目录下,否则保持不变。参数 noclose为0,则关闭标准输入、标准输出和标准错误,否则保持不变。函数调用成功返回0,失败返回-1,并设置错误码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

75. 颜色分类

思路 先排最小的数,将最小的数都放至列表前面 则0~r-1都是最小值 从r到len(nums)-1继续进行排序,从尾部开始,将最大值放置尾部 class Solution(object):def sortColors(self, nums):""":type nums: List[int]:rtype: None …

Python | Leetcode Python题解之第468题验证IP地址

题目: 题解: class Solution:def validIPAddress(self, queryIP: str) -> str:if queryIP.find(".") ! -1:# IPv4last -1for i in range(4):cur (len(queryIP) if i 3 else queryIP.find(".", last 1))if cur -1:return &q…

Window系统编程 - 文件操作

前言 各位师傅大家好,我是qmx_07,今天主要介绍使用windows系统编程操作读写文件 文件 CreateFile()函数讲解 介绍:该函数用于打开文件或者I/O流设备,文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、mailslot 和…

Jenkins Pipline流水线

提到 CI 工具,首先想到的就是“CI 界”的大佬--]enkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很…

看门狗电路设计

看门狗电路设计 看门狗是什么应用架构图TPV6823芯片功能硬件时序图为什么要一般是要保持200个毫秒左右的这种低电平的时间看门狗电路实际应用与条件 看门狗是什么 硬件看门狗芯片,Watch DogTimer,可用于受到电气噪音、电源故障、静电放电等影响(造成软件…

LSTM(长短时记忆网络)

一、引言 在处理序列数据时,循环神经网络(RNN)虽然能够处理序列数据并保留历史信息,但在实践中发现它对于捕捉长时间依赖关系的能力有限,尤其是在训练过程中容易遇到梯度消失或梯度爆炸的问题。为了解决这些问题&…

力扣1031. 两个非重叠子数组的最大和

力扣1031. 两个非重叠子数组的最大和 题目解析及思路 题目要求找到两段长分别为firstLen 和 secondLen的子数组,使两段元素和最大 图解见灵神 枚举第二段区间的右端点,在左边剩余部分中找出元素和最大的第一段区间,并用前缀和优化求子数组…

Nginx基础详解5(nginx集群、四七层的负载均衡、Jmeter工具的使用、实验验证集群的性能与单节点的性能)

续Nginx基础详解4(location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖)-CSDN博客 目录 14.nginx集群(前传) 14.1如何理解单节点和集群的概念 14.2单节点和集群的比较 14.3Nginx中的负载均衡…

对象的概念

对象是编程中一个重要的概念,尤其在面向对象编程(OOP)中更为核心。简单来说,对象是一种数据结构,它可以存储相关的数据和功能。以下是关于对象的详细描述: 1. 对象的定义 对象是属性(数据&…

QT入门教程攻略 QT入门游戏设计:贪吃蛇实现 QT全攻略心得总结

Qt游戏设计:贪吃蛇 游戏简介 贪吃蛇是一款经典的休闲益智类游戏,玩家通过控制蛇的移动来吃掉地图上的食物,使蛇的身体变长。随着游戏的进行,蛇的移动速度会逐渐加快,难度也随之增加。当蛇撞到墙壁或自己的身体时&…

深入探讨JavaScript中的精度问题:原理与解决方案

深入探讨JavaScript中的精度问题:原理与解决方案 在日常的JavaScript开发中,我们经常会遇到一些令人困惑的数值计算问题,特别是涉及到小数点运算时。例如,为什么0.1 0.2的结果不是预期的0.3,而是0.30000000000000004…

Laravel Filament 如何配置多语言支持

演示 一、安装拓展包outerweb/filament-translatable-fields composer require outerweb/filament-translatable-fields配置模型 该套件包含一个名为 HasTranslations 的特性,用于使 Eloquent 模型具备多语言功能。翻译值以 JSON 格式存储,并不需要额外…

Run the FPGA VI 选项的作用

Run the FPGA VI 选项的作用是决定当主机 VI 运行时,FPGA VI 是否会自动运行。 具体作用: 勾选 “Run the FPGA VI”: 当主机 VI 执行时,如果 FPGA VI 没有正在运行,系统将自动启动并运行该 FPGA VI。 这可以确保 FPG…

夜间数据库IO负载飙升?MySQL批量删除操作引发的问题排查

目录 问题现象 问题分析 修改建议 总结 问题现象 近日,某用户反馈他们的MySQL数据库实例在凌晨时段会频繁出现IO负载急剧上升的情况,这种状态会持续一段时间,随后自行恢复正常。为了查明原因,该用户通过DBdoctor工具收集了相…

js进阶——深入解析JavaScript中的URLSearchParams

深入解析 JavaScript 中的 URLSearchParams 在现代Web开发中,我们经常需要处理URL中的查询参数,尤其是在构建动态Web应用时。这些查询参数(query parameters)通常以 ?keyvalue&key2value2 的形式存在。JavaScript 提供了一个…

javascript:void(0)

javascript:void(0)是一种常用于HTML中的Javascript语句,通常用作链接的href属性。它的主要作用是防止链接的默认行为(例如跳转到一个新页面或刷新当前页面),同时又可以执行一些Javascript代码 详细解释 javascript:这是一个协议&#xff0c…

第十三章 Redis短信登录实战(基于Redis)

目录 一、概述 1.1. Session复制 1.2. 使用Redis 二、基于Redis实现共享Session登录 2.1. 实现思路 2.2. 功能实现的主要代码 2.2.1. 用户业务接口 2.2.2. 用户业务接口实现类 2.2.3. 用户控制层 2.2.4. 登录拦截器 2.2.5. 拦截器配置类 2.3. 优化登录拦截器 完…

【PostgreSQL】实战篇——数据备份和恢复的最佳实践和工具

数据备份和恢复是确保数据安全性和可用性的关键环节。无论是由于硬件故障、软件错误、数据损坏还是人为错误,能够快速恢复数据都是保护业务连续性的重要措施。 PostgreSQL 提供了多种备份和恢复工具和方法,其中最常用的包括 pg_dump、pg_restore 和点时…

C++、Ruby和JavaScript

C C最初被称为带类的C, 兼容C的语法,此既是C得以流行的前提,也是C某些语法被捆绑的根源。C的来源于C语言的递增运算符,代表增加,意义为扩展。 C的历史 C类的设计思想来源于Simula. Simula为模拟的意思,被称为最早的面向…

电池大师 2.3.9 | 专业电池管理,延长寿命优化性能

Battery Guru 显示电池使用情况信息,测量电池容量(mAh),并通过有用技巧帮助用户改变充电习惯,延长电池寿命。支持显示电池健康状况,优化电池性能。 大小:9.6M 百度网盘:https://pan…