自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 4.select,poll,epoll

写事件:epoll_wait触发写事件后,若发送缓冲区没有满,不会触发写事件,只有当发送缓冲区由满变为不满时才再次触发。select对所有连接进行遍历,取出有事件产生的连接描述符,判断每个描述符是否在读或写的描述符集合中。读事件:epoll_wait触发读事件后,不管程序有没有处理,都不会再触发,直到有新的数据到达。读事件:若接收缓冲区中有数据、没读完,下次调用epoll_wait时立即触发读事件。写事件:若写缓冲区未满,下次调用epoll_wait时立即触发写事件。发生变化的文件描述符作为数组返回。

2024-06-20 15:06:26 297

原创 Linux_线程同步_条件变量

mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP),且在调用pthread_cond_wait()前必须由本线程加锁(pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开pthread_cond_wait()之前,mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应。另一个线程使"条件成立"信号。

2024-06-18 14:44:33 384

原创 Linux_线程同步_信号量

信号量本质上是一种非负的整数计数器,用来控制对公共资源的访问。当信号量值大于0时则可以访问,否则将阻塞。PV原语是对信号量的操作,P操作减一、V操作加一。

2024-06-18 14:33:13 149

原创 Linux_线程同步_自旋锁

自旋锁一般适用的场景是锁被其他线程短期持有(很快会被释放),而且等待该锁的线程不希望在阻塞期间被取消调度,因为这会带来一些开销,因此操作系统的内核经常使用自旋锁。如果自旋执行时间太长,会有大量的线程处于自旋状态占用CPU资源,进而会影响整体系统的性能,因此可以给自旋锁设定一个自旋时间,等时间一到立即释放自旋锁。不会使线程进入阻塞状态,减少了不必要的上下文切换,执行速度快。和互斥锁类似,只是当加锁操作被阻塞,阻塞的方式不同:互斥锁是通过将线程睡眠,自旋锁则是通过忙等待的方式,不断判断锁是否能够被成功获取。

2024-06-18 13:49:33 141

原创 Linux_线程同步_读写锁

读写锁是“读模式加锁”时, 既有试图以写模式加锁的线程,也有试图以读模式加锁的线程。那么读写锁会阻塞随后的读模式锁请求。读锁、写锁并行阻塞,写锁优先级高。读写锁是“读模式加锁”时, 如果线程以读模式对其加锁会成功;如果线程以写模式加锁会阻塞。读写锁是“写模式加锁”时, 解锁前,所有对该锁加锁的线程都会被阻塞。读写锁适合于对数据结构读的次数远大于写的情况。特性:写独占,读共享。

2024-06-18 13:41:54 297

原创 Linux_线程同步_互斥锁

在lock与unlock之间调用pthread_exit,或者在线程外部调用pthread_cancel,其他线程被永久死锁。互斥锁保证锁定的代码只能同时一个线程执行,但不能保证必需执行完!

2024-06-18 13:35:08 199

原创 Linux_线程同步_死锁

存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。, pn},其中Pi等待的资源被P(i+1)占有(i=0, 1, …进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。

2024-06-18 13:20:39 127

原创 CesiumForUnreal_3dtiles剖切

新建材质参数集并添加向量参数:新建蓝图类CutBox、添加盒体碰撞组件,在构造函数中设置以上参数:新建材质函数并获取BoxCenter和BoxBound参数,判断模型部分是否在盒体内:新建材质图层混合,设置不透明蒙版:上图中如果是设置TopLayer的基础颜色并输出,则将盒体内的模型高亮,新建材质图层设置颜色:

2024-06-11 10:18:17 213

原创 3.多进程、多线程并发服务器

该状态可以在创建线程时指定,或在线程创建之后在线程函数开头detach自己:pthread_detach(pthread_self()),在线程函数中就可以直接调用pthread_exit(NULL)退出。joinable状态,当线程函数自己返回退出时或pthread_exit()时都不会释放线程占用的堆栈和线程描述符(总计8k多),只有调用了pthread_join之后资源才会被释放。,成功后返回0,如果tid是分离线程或者不是当前进程中的有效线程则返回错误。返回0代表成功,失败返回的是错误号。

2024-06-07 15:00:15 689

原创 2.编写自己的Socket

但每个实例绑定的IP地址是不能相同的。1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。需要注意的是,设置端口复用函数要在绑定之前调用,而且只要绑定到同一个端口的所有套接字都得设置复用。

2024-06-06 16:46:22 274

原创 1.Socket编程

短整型从主机字节序转为网络字节序:uint16_t htons(uint16_t hostshort)整型从主机字节序转为网络字节序:uint32_t htonl(uint32_t hostshort)​ uint32_t ntohl(uint32_t netlong) 转ip地址。反过来:uint16_t ntohs(uint16_t netlong) 转端口。反过来char* inet_ntoa(struct in_addr_in)char** h_addr_list //主机IP地址。

2024-06-06 16:45:38 827

原创 Linux_文件操作

buffer是读取与写入数据后存放地址,size是块长度,count是块的数量,实际读取长度为size*count,返回值为成功读取块的count数量。mode: 用来规定对该文件的所有者,文件的用户组及系统中其他用户的访问权限,则文件权限为:mode&(~umask)前者返回一个文件描述符(用户程序区的)int,后者返回一个文件指针FILE*。用于获取文件信息,在 statbuf 指向的缓冲区中返回有关文件的信息。dup 文件描述符的复制,用于重定向,使新的描述符指向同一文件。

2024-06-06 16:36:34 925

原创 Linux_进程间通信_管道

读管道:管道中有数据,read返回实际读到的字节数。管道中无数据:写端被全部关闭,read返回0(相当于读到文件的末尾);写端没有完全关闭,read阻塞等待写管道:管道读端全部被关闭,进程异常终止(进程收到SIGPIPE信号)管道读端没有全部关闭:管道已满,write阻塞;管道没有满,write将数据写入,并返回实际写入的字节数。

2024-06-06 16:20:48 295

原创 Linux_进程间通信_内存映射

内存映射(Memory-mapped I/O)是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。

2024-06-06 16:03:29 277

原创 Linux_进程间通信_信号量

​ 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个进/线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。​ 信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和释放(即V(信号变量))信息操作。最简单的信号量是只能取0和1的变量,这也是信号量最常见的一种形式,叫做二进制信号量。可以取多个正整数的信号量被称为通用信号量。

2024-06-06 15:27:34 245

原创 Linux_进程间通信_共享内存

为引用这块共享内存,程序需要使用由 shmat() 调用返回的 addr 值,它是一个指向进程的虚拟地址空间中该共享内存段的起点的指针。​ 调用 shmget() 创建一个新共享内存段或取得一个既有共享内存段的标识符(即由其他进程创建的共享内存段)。- 功能:对共享内存进行操作。​ 所以需要做的就是让一个进程将数据复制进共享内存中,并且这部分数据会对其他所有共享同一个段的进程可用。​ - 共享内存:进程退出,共享内存还在,标记删除(所有的关联的进程数为0),或者关机。

2024-06-05 22:20:50 904

原创 Linux_exec函数族

​ exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程 ID 等一些表面上的信息仍保持原样,只有调用失败了,它们才会返回 -1,并设置errno,从原程序的调用点接着往下执行。​ exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。**system函数:**system(char *),执行完成后返回程序,继续流程;

2024-06-05 22:00:28 167

原创 Linux_进程间通信_信号

​ 前 31 个信号为常规信号,其余为实时信号。**查看系统定义的信号列表:**kill –l**查看信号的详细信息:**man 7 signal。

2024-06-05 17:25:05 778

原创 Linux_进程、会话、守护进程

​ 在 UNIX 系统中,用户通过终端登录系统后得到一个 shell 进程,这个终端成为 shell 进程的控制终端(Controlling Terminal),进程中,控制终端是保存在 PCB 中的信息,而 fork() 会复制 PCB 中的信息,因此由 shell 进程启动的其它进程的控制终端也是这个终端。进程组首进程无需是最后一个离开进程组的成员。一个进程组拥有一个进程组首进程,该进程是创建该组的进程,其进程 ID 为该进程组的 ID,新进程会继承其父进程所属的进程组 ID。

2024-06-05 16:42:49 983

原创 Linux_进程

首先,内核会给每个进程分配相等的初始时间片,然后每个进程轮番指向相应的时间,当所有进程处于时间片耗尽状态时,内核会重新为每个进程计算并分配时间片。对于处理网络请求的服务器进程来说,父进程可能会一直存在,子进程处理完任务就退出,这种情况下会产生很多僵尸进程,这种场景就需要对僵尸进程的处理提高警惕了。​ 表示当前进程可以被调度,但是调还是没调不知道。​ 当进程要退出的时候,在系统层面,曾经申请的资源并不是被立即释放,而是暂存一段时间,供父进程进行读取,此时该进程处于僵尸状态。

2024-06-05 16:27:52 785

原创 Linux系统错误

变量errno在<errno.h>中声明。

2024-06-05 15:19:27 294

原创 Linux目录操作

/获取后需要通过free()函数释放内存。​ bool S_ISREG(st_mode) //是否为普通文件。​ 当满足mode的条件时返回0,不满足返回-1,errno被设置。​ bool S_ISDIR(st_mode) //是否为目录。​ 成功返回0,失败返回其他(上级目录不存在或没有权限)​ 成功返回0,失败返回其他(目录不存在或没有权限)​ 成功返回0,失败返回其他(目录不存在或没有权限)

2024-06-05 15:07:46 651

原创 Linux时间操作

​ UNIX操作系统根据计算机产生的年代把1970年1月1日作为UNIX纪元时间,将从该时间起的秒数用一个整数存放。

2024-06-05 14:31:18 315

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除