Linux环境编程
linux环境编程学习
l_ethan
这个作者很懒,什么都没留下…
展开
-
5.6EPOLLONESHOT事件
即使可以使用 ET 模式,一个socket 上的某个事件还是可能被触发多次。这在并发程序中就会引起一个 问题。比如一个线程在读取完某个 socket 上的数据后开始处理这些数据,而在数据的处理过程中该 socket 上又有新数据可读(EPOLLIN 再次被触发),此时另外一个线程被唤醒来读取这些新的数据。于 是就出现了两个线程同时操作一个 socket 的局面。一个socket连接在任一时刻都只被一个线程处理,可 以使用 epoll 的 EPOLLONESHOT 事件实现。 对于注册了EPOLLONESHO原创 2022-07-10 20:33:23 · 606 阅读 · 3 评论 -
5.5线程池
线程池是由服务器预先创建的一组子线程,线程池中的线程数量应该和 CPU 数量差不多。线程池中的所 有子线程都运行着相同的代码。当有新的任务到来时,主线程将通过某种方式选择线程池中的某一个子 线程来为之服务。相比与动态的创建子线程,选择一个已经存在的子线程的代价显然要小得多。至于主 线程选择哪个子线程来为新任务服务,则有多种方式:主线程使用某种算法来主动选择子线程。最简单、最常用的算法是随机算法和 Round Robin(轮流 选取)算法,但更优秀、更智能的算法将使任务在各个工作线程中更均匀地分配,从而减轻服原创 2022-07-02 16:24:51 · 194 阅读 · 0 评论 -
5.4服务器编程基本框架和两种高效的事件处理模式
虽然服务器程序种类繁多,但其基本框架都一样,不同之处在于逻辑处理。I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作:等待并接受新的客户连接,接收 客户数据,将服务器响应数据返回给客户端。但是数据的收发不一定在 I/O 处理单元中执行,也可能在 逻辑单元中执行,具体在何处执行取决于事件处理模式。一个逻辑单元通常是一个进程或线程。它分析并处理客户数据,然后将结果传递给 I/O 处理单元或者直 接发送给客户端(具体使用哪种方式取决于事件处理模式)。服务器通常拥有多个逻辑单元,以实现对 多个客户任务原创 2022-07-02 09:38:45 · 427 阅读 · 0 评论 -
5.3Web服务器简介及HTTP协议
一个 Web Server 就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主 要功能是通过 HTTP 协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自 客户端的 HTTP 请求,并对其请求做出 HTTP 响应,返回给客户端其请求的内容(文件、网页等)或返 回一个 Error 信息。通常用户使用 Web 浏览器与相应服务器进行通信。在浏览器中键入“域名”或“IP地址:端口号”,浏览器则 先将你的域名解析成相应的 IP 地址或者直接根据你的IP地址向对应的原创 2022-07-01 21:51:16 · 497 阅读 · 0 评论 -
5.2Unix/Linux上的五种IO模型
调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等这个函数返回才能进行下一步动作。非阻塞等待,每隔一段时间就去检测IO事件是否就绪。没有就绪就可以做其他事。非阻塞I/O执行系统调用总是立即返回,不管事件是否已经发生,若事件没有发生,则返回-1,此时可以根据 errno 区分这两种情况,对于accept,recv 和 send,事件未发生时,errno 通常被设置成 EAGAIN。Linux用select/poll/epoll函数实现IO复用模型,这些函数也会使进程原创 2022-06-30 19:40:09 · 724 阅读 · 0 评论 -
5.1阻塞和非阻塞/同步和异步
典型的一次IO的两个阶段是什么?数据就绪 和 数据读写数据就绪:根据系统IO操作的就绪状态阻塞非阻塞数据读写:根据应用程序和内核的交互方式同步异步在处理 IO 的时候,阻塞和非阻塞都是同步 IO,只有使用了特殊的 API 才是异步 IO。一个典型的网络IO接口调用,分为两个阶段,分别是“数据就绪” 和 “数据读写”,数据就绪阶段分为 阻塞和非阻塞,表现得结果就是,阻塞当前线程或是直接返回。同步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),数据的读写都是 由请求方A自己来完成的(不原创 2022-06-30 17:31:30 · 88 阅读 · 0 评论 -
4.35本地套接字通信
server: client:原创 2022-06-29 17:02:37 · 210 阅读 · 0 评论 -
4.34组播
server: client:原创 2022-06-29 14:40:03 · 91 阅读 · 0 评论 -
4.33广播
server:client:原创 2022-06-29 10:23:13 · 80 阅读 · 0 评论 -
4.32UDP通信实现
server:client:原创 2022-06-28 22:54:57 · 148 阅读 · 0 评论 -
4.25 I/O多路复用技术
目录简介SelectPOIIepollI/O 多路复用使得程序能同时监听多个文件描述符,能够提高程序的性能,Linux 下实现 I/O 多路复用的 系统调用主要有 select、poll 和 epoll。1.阻塞等待:2.BIO模型3.非阻塞忙轮询NIO模型:4.I/O多路复用技术4.1select/poll4.2expollselect代码编写对应clientPOII对select缺点进行一个改进(没有解决内核态和用户态转变的问题,只是解决了1024比特位的限制以及不能重用每次都需要重置的原创 2022-06-28 19:38:13 · 271 阅读 · 0 评论 -
4.24半关闭、端口复用
目录半关闭端口复用 半关闭 :当 TCP 链接中 A 向 B 发送 FIN 请求关闭,另一端 B 回应 ACK 之后(A 端进入 FIN_WAIT_2 状态),并没有立即发送 FIN 给 A,A 方处于半连接状态(半开关),此时 A 可以接收 B 发 送的数据,但是 A 已经不能再向 B 发送数据。端口复用最常用的用途是:1.防止服务器重启时之前绑定的端口还未释放2.程序突然退出而系统没有释放端口server:client:...原创 2022-06-25 15:50:22 · 434 阅读 · 0 评论 -
4.20-4.22多进程/多线程实现并发服务器
serverclient:原创 2022-06-24 10:11:43 · 493 阅读 · 0 评论 -
4.17-4.19TCP
目录三次握手滑动窗口四次挥手 q:为什么不能是两次握手?a:1.第一次握手 c->s c可以确定c发 s无 s可以确定c发s收 SYN=1,seq=y2.第二次握手 s->c c可以确定c发收 s发收 s可以确定c发s发收 SYN=1,ACK=1,ack=y+1,seq=k3.第三次握手 c->s c可以确定c发收s发收 s可以确定c发收s发收 ACK=1,ack=k+1(ACK为1才有用)q:为什么不能是四次握手?可以但是将第二次握手的syn和ack整合在一起更简便.........原创 2022-06-23 10:49:07 · 513 阅读 · 0 评论 -
4.8Socket套接字
介绍字节序介绍:原创 2022-06-21 10:28:49 · 169 阅读 · 0 评论 -
4.7网络通信的过程
封装分用原创 2022-06-08 11:32:02 · 68 阅读 · 0 评论 -
4.5协议
1.udp协议 2.tcp协议 3.IP协议 4.以太网帧协议 5.arp协议原创 2022-06-07 10:22:37 · 81 阅读 · 0 评论 -
MAC地址、IP地址、端口
255是广播地址 000是本机地址 网络端:子网掩码&ip地址 主机号:~子网掩码&ip地址 信息读取写入的缓存原创 2022-06-06 10:38:47 · 236 阅读 · 0 评论 -
4.4网络协议
1.osi七层模型(物,数,网,传,会,表,应) 2.tcp/ip四层模型原创 2022-06-06 12:06:22 · 78 阅读 · 0 评论 -
4.1网络结构模式
C/S结构优缺点:B/S架构: 优缺点:原创 2022-06-05 11:12:19 · 81 阅读 · 0 评论 -
3.12生产者消费者模型(pthread_cond_t、sem_t)
生产者消费者模型生产者不能在容器满了继续生产消费者不能在容器为空的时候消费通过设置条件变量来在没有资料的时候消费者等待生产者来生产信号量解决原创 2022-06-04 17:47:51 · 513 阅读 · 0 评论 -
3.7线程同步问题
上面这个代码是有问题的他对于共享资源的代码片段没有进行保护解决方法1:互斥量 互斥量可能会产生死锁的问题 死锁例子1死锁例子2 对于读操作比写操作要多很多的场景可以用读写锁来提高效率...原创 2022-06-03 15:33:42 · 104 阅读 · 0 评论 -
3.7线程属性
linux线程属性原创 2022-06-01 09:50:14 · 79 阅读 · 0 评论 -
3.6线程取消
/* #include <pthread.h> int pthread_cancel(pthread_t thread) 功能:取消线程(让线程终止)要到某个取消点才会取消 取消某个线程,可以终止某个线程的运行, 但不是立马终止,而是当子线程执行到一个取消点,线程才会终止 取消点:系统规定号的一些系统调用,我们可以粗略的理解为从用户区到内核区系统的.原创 2022-05-31 16:18:21 · 192 阅读 · 0 评论 -
3.5线程的分离
/* #include <pthread.h> int pthread_detach(pthread_t thread); 功能:分离一个线程,被分离的线程在终止的时候会自动释放资源返回给系统 1.不能多次分离,会产生不可预料的行为。 2.不能去连接一个已经分里的线程,会报错。 参数:需要分离的线程的id 返回值: 成功:0 失败:返回错.原创 2022-05-31 15:42:22 · 104 阅读 · 0 评论 -
3.4连接已终止的线程
/* #include <pthread.h> int pthread_join(pthread_t thread, void **retval); 功能:和一个已经终止的线程进行连接 回收子线程的资源 这个函数是阻塞函数,调用一次只能回收一个子线程 一般在主线程中使用 参数: thread:需要回收的子线程的id retva.原创 2022-05-29 20:49:15 · 76 阅读 · 0 评论 -
3.3终止进程
/* #include <pthread.h> void pthread_exit(void *retval); 功能:终止一个线程,在哪个线程中调用,就表示终止哪个线程 参数: retval:需要传递一个指针,作为一个返回值,可以在pthread_join()中获取到 pthread_t phtread_self(void); 功能:获取当前线程的线程id int pthread_eq.原创 2022-05-28 17:23:36 · 63 阅读 · 0 评论 -
3.2创建线程
由于线程在第三方库中所以需要-phtread或者-lpthread来编译连接/* 一般情况下,main函数所在的线程我们称之为主线程(main线程),其余创建的线程 称之为子线程 程序中默认只有一个进程,fork()函数调用,2进程 程序中默认只有一个线程,phtread_create()函数调用,2个线程。 #include <pthread.h> int pthread_create(pthread_t *thre...原创 2022-05-28 16:29:52 · 115 阅读 · 0 评论 -
3.1线程概述
.text指的是代码段原创 2022-05-28 15:43:55 · 85 阅读 · 0 评论 -
2.28-29共享内存
效率最高的进程通信方式共享内存相关的函数#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg); - 功能:创建一个新的共享内存段,或者获取一个既有的共享内存段的标识。 新创建的内存段中的数据都会被初始化为0 - 参数: - key : key_t类型是一个整形,通过这个找到或者创建一个...原创 2022-05-05 20:17:48 · 487 阅读 · 0 评论 -
2.27sigchld信号
/* SIGCHILD信号产生的3个条件: 1.子进程结束 2.子进程暂停了 3.子进程继续运行 都会给父进程发送该信号,父进程默认忽略该信号 使用SIGCHLD信号解决僵尸进程的问题*/#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include...原创 2022-05-04 17:13:52 · 147 阅读 · 0 评论 -
2.26sigaction信号捕捉函数
sigaction比signal的适用环境的范围更广,因此更加推荐使用sigaction来捕捉信号/* #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 功能:检查或者改变信号的处理。信号捕捉。 参数: signum:需要捕捉的信号的编号或者宏值(.原创 2022-05-03 19:51:16 · 234 阅读 · 0 评论 -
2.25sigprocmask函数
用于系统信号集/* #include <signal.h> int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 功能:将自定义信号集中的数据设置到内核中(设置阻塞,解除阻塞,替换) 参数: how:如何对内核阻塞信号集进行处理 SIG_BLOCK:将用户设置的阻塞信号集添加到内核中,内核中原来的数据不变 ..原创 2022-05-02 17:32:28 · 810 阅读 · 0 评论 -
2.24信号集及相关函数
1.用户通过键盘 Ctrl+c 产生2号信号SIGINT(信号被创建)2.信号产生但是没有被处理(未决)在内核中将所有没有被处理的信号存储在一个集合中(未决信号集)SIGINT信号状态被存储在第二个标准位上这个标志位的值位0,说明信号不是未决状态这个标志位的值位1,说明信号处于未决状态3.这个未决状态的信号,需要被处理,处理之前需要和另一个信号集(阻塞信号集),进行比较阻塞信号集默认不阻塞任何的信号如果想要阻塞某些信号需要用户调用系统API4.在处理的时候和阻塞...原创 2022-05-02 17:36:02 · 115 阅读 · 0 评论 -
2.23signal信号捕捉函数
/* #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 功能:设置某个信号的捕捉行为 参数: signum:要捕捉的信号 handler:捕捉到信号要如何处理 SIG_IGN:忽略信号 .原创 2022-05-01 11:23:47 · 258 阅读 · 0 评论 -
2.20-22kill、raise、abort、alarm、settimer函数
/* #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); -功能:给任何的进程或者进程组pid,发送某个信号任何的信号 sig -参数: -pid:需要发送给的进程的id >0 : 将信号发送给指定的进程 =0 : 将信号发送给当前...原创 2022-04-30 15:22:58 · 282 阅读 · 0 评论 -
2.19信号概述
-9 任何进程指的是正常的进程,不包括僵尸进程红色要注意记忆原创 2022-04-30 11:33:48 · 101 阅读 · 0 评论 -
2.16有名管道实现简单版聊天功能
功能简易只能简单的读一次写一次可以用多进程的方式实现传统的多次读写chatA.c:#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>#include <fcntl.h>#include <string.h>int main(){ //原创 2022-04-28 19:35:01 · 99 阅读 · 0 评论 -
2.15有名管道介绍及使用
1.通过命令创建管道2.通过函数创建管道/* 创建fifo文件 1.通过命令: mkfifo 名字 2.通过函数 #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 参数: -pathname:管道名称的路径 ...原创 2022-04-27 20:26:55 · 467 阅读 · 0 评论 -
2.14管道的读写特点和管道设置为非阻塞
管道的读写特点使用管道时,需要注意以下几种特殊的情况(假设都是阻塞I/O操作)1.所有的指向管道写端的文件描述符都关闭了(管道的写端引用计数为0),由进程从管道的读端读数据。那么管道中剩余的数据被读取以后,再次read会返回0,就像读到文件末尾一样2.如果有指向管道写端的文件描述符没有关闭(管道的写端引用计数大于0),而持有管道写端的进程也没有往管道中写数据,这个时候有进程从管道中读取数据,那么管道中剩余的数据被读取后,再次read会阻塞,知道管道中有数据可以读了才读取数据并返回3.如果所原创 2022-04-27 15:47:43 · 439 阅读 · 0 评论