首页
学习
活动
专区
圈层
工具
发布

Linux下基于TCP协议的群聊系统设计(多线程+select)

一、功能介绍 这是基于Linux下命令行设计的一个简单的群聊天程序。...这个例子可以学习、巩固Linux下网络编程相关知识点 练习Linux下socket、TCP编程 练习Linux下pthread、线程编程 练习Linux下多路IO检测、select函数使用 练习C语言链表使用...服务器里采用多线程的形式,每连接上一个客户端就创建一个子线程单独处理;用了一个全局链表存放已经连接上来的客户端,当一个客户端发来消息后,就逐个转发给其他客户端,客户端断开连接下线后,就删除对应的节点;链表添加节点...好友上线通知、正常聊天效果: 好友下线提示: 二、select函数功能、参数介绍 在linux命令行可以直接man查看select函数的原型、头文件、帮助、例子 相关信息。...Linux下监听文件描述符状态的函数有3个:select、poll、epoll,这3个函数都可以用在socket网络编程里监听客户端、服务器的状态。

1.5K30

linux select函数详解

http://blog.csdn.net/lingfengtengfei/article/details/12392449 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select...(5)structtimeval* timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态,第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态...(2)将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集中的fd,一是用于再select返回后,array作为源数据和fd_set进行FD_ISSET判断。...(3)可见select模型必须在select前循环array(加fd,取maxfd),select返回后循环array(FD_ISSET判断是否有时间发生)。 基本原理 ?...select()系统调用代码走读 调用顺序如下:sys_select() à core_sys_select() à do_select() à fop->poll() ? ? ? ? ? ?

5.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux网络】select函数

    select函数介绍 在Linux网络编程中,select 函数是一种非常有用的IO多路复用技术,它允许程序监视多个文件描述符(file descriptors),以等待一个或多个文件描述符变得“就绪”...#include select.h> #include #include int select(int nfds, fd_set...所谓的”准备好“状态是指:文件描述符不再是阻塞状态,可以用于某类IO操作了,包括可读,可写,发生异常三种 select函数参数介绍 nfds select函数一次会等待多个文件描述符,nfds通常为设置的最大文件描述符...函数返回值 成功时,select返回就绪的文件描述符的总数....来保存程序需要等待的文件描述符,保证调用 select 的时候readfds 和 writefds中的将如下: TCP服务器【多路复用版】 如果是一个select服务器进程,则服务器进程会不断的接收有新链接

    88710

    Linux下select使用陷阱

    Select函数使用简单,其工作原理大家通常也知道,但是在实际的使用过程中可能并没有严格遵守,而且确实也比较难以完全遵守,除非不使用它。...Select采用一个bit表,每个fd对应表中的一个bit位,宏FD_SETSIZE为表的大小,添加到fd_set中的fd值必须小于FD_SETSIZE,否则就会越界,假设有如下一段代码: fd_set...较容易发生在服务端程序中,因为服务端程序同一时刻的连接数很容易超过默认的FD_SETSIZE值,而服务端的代码可能是使用epoll使用的,所以它本身并不会存在问题,但是程序中可能还有个客户端,比如使用了select...来实现超时连接,这个时候问题就来了,当连接数超过FD_SETSIZE时,超时连接处的select调用就发生了越界,进程就会在某个可能完全不相干的地方crash,要定位这个问题的成本是很高的,不具备一定经验...那就是尽量不使用select,而应当使用更安全的poll函数来替代,因为poll使用的数组是调用者自己维护的,完全可以保证不越界。

    2.4K40

    【Linux】多线程——线程概念|Linux下进程与线程|线程控制

    所以在Linux中,可以把进程和线程做一个统一,CPU看到的task_struct称为轻量级进程 在Linux中,什么是线程:CPU调度的基本单位!...所以Linux中,没有给Linux"线程"去专门设计对应的数据结构!而是直接复用PCB!用PCB来表示Linux内部的“线程”!...也就是说,Linux内核中有没有真正意义的线程,严格上来说是没有的,Linux是用进程PCB来模拟线程的,是一种完全属于自己的一套线程方案。...3.Linux线程是CPU调度的基本单位,而进程是承担分配系统资源的基本单位 4.进程用来整体申请资源,线程用来伸手向进程要资源 5.Linux中没有真正意义的线程。通过进程模拟。...,在Linux中,如果要实现多线程,必定要使用pthread库,如何看待C++11中的多线程:C++11的多线程,在Linux环境中本质就是对pthread库的封装。

    1.7K30

    【Linux】线程

    线程(Thread) 1. 什么是线程? 线程是进程中的一个执行单元,它是 CPU 调度的基本单位。线程依赖于进程存在,一个进程可以包含多个线程,这些线程可以并发执行,提高程序的运行效率。...进程是承担系统分配系统资源的实体 线程是操作系统调度的基本单位 用一张图简要说明一下什么是线程: 首先我们要知道,在Linux中是没有实际的线程的,线程是被模拟出来的,Linux实际上使用LWP...LWP(Light Weight Process,轻量级进程)是 Linux 线程实现的一种机制,它与传统进程共享大部分资源,但仍有自己的调度信息。...创建线程 pthread_create是用于创建线程的函数,这个函数不是系统调用,因为Linux实际上是没有实体的线程,这个创建线程的函数是在pthread.h中封装的函数。...ps -aL 可以看见确实有两个线程,两个线程的pid是相同的,那哪一个是主线程,哪一个是新线程呢?pid和lwp相同的是主线程,pid和lwp不同的是新线程。

    1.4K00

    Linux下select调用引发的血案

    Select函数使用简单,其工作原理大家通常也知道,但是在实际的使用过程中可能并没有严格遵守,而且确实也比较难以完全遵守,除非不使用它。...Select采用一个bit表,每个fd对应表中的一个bit位,宏FD_SETSIZE为表的大小,添加到fd_set中的fd值必须小于FD_SETSIZE,否则就会越界,假设有如下一段代码: fd_set...较容易发生在服务端程序中,因为服务端程序同一时刻的连接数很容易超过默认的FD_SETSIZE值,而服务端的代码可能是使用epoll使用的,所以它本身并不会存在问题,但是程序中可能还有个客户端,比如使用了select...来实现超时连接,这个时候问题就来了,当连接数超过FD_SETSIZE时,超时连接处的select调用就发生了越界,进程就会在某个可能完全不相干的地方crash,要定位这个问题的成本是很高的,不具备一定经验...那就是尽量不使用select,而应当使用更安全的poll函数来替代,因为poll使用的数组是调用者自己维护的,完全可以保证不越界。

    2.2K20

    【Linux网络】多路转接:select、poll、epoll

    1、select 在Linux中,常见的多路转接/复用有 select、poll 和 epoll 。...select 函数原型: #include select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set...3、epoll epoll 是 Linux 系统中一种高效的 I/O 事件通知机制,常用于处理大量文件描述符的 I/O 事件,特别适合高并发场景。...3.1 epoll_create int epoll_create(int size); 在内核中创建一个 epoll 模型,并返回文件描述符用于后续的操作; 自从 linux2.6.8 之后,size...) 如果函数调用成功,返回对应 I/O 上已准备好的文件描述符数目,如返回 0 表 示已超时,返回小于 0 表示函数失败 3.4 epoll 工作原理 当进程调用 epoll_create 方法时,Linux

    77210

    Linux多线程【线程池】

    ✨个人主页: 北 海 所属专栏: Linux学习之旅 操作环境: CentOS 7.6 腾讯云远程服务器 前言 线程池是一种管理线程的机制,它可以在需要时自动创建和销毁线程,以及分配和回收线程资源...总之多线程算是正式结束了,下一篇将会打开网络的大门 相关文章推荐 Linux多线程 =====:> 【初始多线程】、【线程控制】、【线程互斥与同步】、【生产者消费者模型】 Linux...进程信号 ===== :> 【信号产生】、【信号保存】、【信号处理】 Linux进程间通信 ===== :> 【消息队列、信号量】、【共享内存】、【命名管道】、【匿名管道】 Linux基础IO...】、【创建、终止、等待】 Linux进程学习 ===== :> 【进程地址】、【环境变量】、【进程状态】、【基本认知】 Linux基础 ===== :> 【gdb】、【git】、【gcc/g++...】、【vim】、Linux 权限理解和学习、听说Linux基础指令很多?

    1.9K40

    【Linux】线程的奥秘:Linux线程入门指南

    那么线程是什么,它和进程又有什么区别呢? 1. 什么是线程 线程(Thread)是操作系统中的一个重要的执行单元,是程序执行的最小调度单元。...线程存在于进程内部,一个进程可以包含一个或者多个线程,线程共享进程的资源并独立运行。 同时我们还要知道进程是承担系统资源分配的基本实体,而线程是CPU运行的基本单位。 2....开销 创建和切换开销较小 创建和切换开销较大 通信 同进程线程通信简单 需要使用 IPC(管道、共享内存等) 崩溃影响 一个线程崩溃会影响进程 一个进程崩溃对其他进程无直接影响 3.1 Linux与...Windows不同的线程设计 在Linux中,由于PCB和TCB的共同点太多了,于是直接复用了PCB的设计和调度策略,这样大大减少了系统的调度时的开销,因此Linux中实际没有真正的线程概念,有的只是复用了...在这种设计思想下,线程注定不会过于庞大,因此Linux中的线程又可以称为轻量级进程LWP,轻量级进程足够简单,且易于维护,效率更高、安全性强,可以使得Linux系统不间断的运行,不容易崩溃。

    81110

    【Linux】线程互斥之线程加锁

    一、锁的定义 线程加锁是在多线程编程环境中,为了确保在同一时刻只有一个线程能够访问特定的共享资源或执行特定的代码段,而采取的一种同步手段,通过在需要保护的资源或代码段前获取锁,在访问完成后释放锁,来实现对共享资源的互斥访问...有一段时间的票都是一个线程抢到的,我们预想的应该是几乎平均分配的样子 这说明了几个问题: 第一,线程对于锁的竞争能力不同,一定有一个首先抢到锁的线程 第二,一般来说,刚解锁再去抢锁的更容易一些...,类似于上面的结果,一直是线程1在抢票 (二)锁和线程 对于上面第二个问题来说,我们有处理方法,这种方法就是同步,同步可以让所有的线程按照一定的顺序获取锁 对于其他线程来讲,一个线程要么获取到了锁,要么释放了锁...,当前进程访问临界区的过程对于其他线程是原子的 在加锁期间,即解锁之前,是可以发生线程切换的,线程切换的时候是拿着锁走的,被锁起来的内容其他线程也是访问不到临界区的的,在该线程再次切换回来的时候,恢复线程上下文继续访问临界区代码...,结合操作系统内核态的底层同步原语支持以及库层面的合理封装,来确保操作的原子性),这样可以确保在多线程环境下对共享资源加锁和解锁操作的完整性与一致性,避免因多线程并发干扰导致锁状态异常,进而保障线程安全和数据的正确性

    61210

    【Linux】线程互斥

    线程互斥 一、互斥概念 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。...但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。多个线程并发的操作共享变量,会带来一些问题。 例如下面我们模拟一个多线程抢票的程序。...那么假设我们现在有两个线程,分别为线程1和线程2,在线程执行的代码间隙中,线程是随时有可能会被切换的!而线程在执行的时候,将共享数据加载到 CPU 寄存器的本质就是把数据的内容变成了自己上下文的内容!...互斥锁接口 在 Linux 中,pthread 库给我们提供了一种互斥锁解决上面多线程访问共享数据不一致的问题。...所以对于其它线程来说,一个线程要么没有锁,要么释放锁,当前线程访问临界区的过程,对于其它线程是原子的! 3.

    1K10

    Linux多线程

    线程是进程内部的一个执行流,在Linux下并没有为线程额外创建数据结构来管理,而是通过只建立PCB来模拟实现的;但是在Windows下为了管理线程又创建了TCB内核数据结构来管理; Linux这种方式一方面是提高了代码的复用率...,而是线程;线程的资源是占用进程的,所以进程其实是分配操作系统资源的基本单位 Linux下进程和线程的关系: 之前我们接触的都是单进程多线程或者多个单线程进程 3.线程的数据属性 一个进程内部的线程共享大部分的资源比如...Linux没有真正的线程,所以它没有提供创建线程的系统调用接口,只提供了轻量级进程的接口,所以要创建线程还需要借助原生线程库(pthread),但其实创建的还是轻量级进程,首先来认识一下创建接口 PTHREAD_CREATE...那么该全局变量则会映射到新线程的线程栈中,此后如果某一个线程修改了该全局变量不会影响到其他线程 ---- 线程控制 1.创建多线程 在Linux下连续创建10个线程,将自定义类对象传到新创建的线程中...:"Linux是64位系统,指针八字节 delete e; } cout线程退出

    1.6K30

    【Linux】线程互斥

    ,第2步在寄存器中对数据做--操作 线程A正准备做第3步时,时间片到了,线程A不能继续向后运行了 线程A要把自己的上下文保护起来,并且将寄存器中的数据也带走了 ---- 线程a认为值已经被改成99了...,所以无法执行第3步,把线程B的上下文保存起来 ---- 此时再次执行线程A,由于上次执行线程A时第3步没有执行,所以线程A继续执行第3步 但是内存中的g_val为上次线程B修改后的值10,又被改为99...任何一个线程 都有自己的代码访问临界资源,这部分代码 被称为 临界区 同样存在不访问临界资源的区域 被称为 非临界区 用于 衡量 线程代码的 让多个线程安全的访问临界资源 —— 加锁 即完成互斥访问...再将寄存器中的数据 与 内存中的数据 进行 交换 ---- 线程b 继续执行时 要进行判断 ,寄存器数据不大于0,当前线程被挂起 线程b申请锁失败 线程b 带走了自己的上下文 即 寄存器中的数据为0...---- 再次切换成 线程a,带回来线程a的寄存器数据 1,并继续执行 上次还未执行到的判断 ---- 线程a的寄存器中的数据大于0,返回0,申请锁成功

    90630

    Linux线程调度

    在Linux中,线程是由进程来实现,线程就是轻量级进程( lightweight process ),因此在Linux中,线程的调度是按照进程的调度方式来进行调度的,也就是说线程是调度单元...Linux这样实现的线程的好处的之一是:线程调度直接使用进程调度就可以了,没必要再搞一个进程内的线程调度器。...在Linux中,调度器是基于线程的调度策略(scheduling policy)和静态调度优先级(static scheduling priority)来决定那个线程来运行。...下面介绍几种常见的调度策略: SCHED_OTHER:该策略是是默认的Linux分时调度(time-sharing scheduling)策略,它是Linux线程默认的调度策略。...那么在Linux中,在什么情况下要执行这个调度程序呢?我们把这种情况叫作调度时机。

    5K21
    领券