自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 UDP特性之组播(多播)

注意事项:在组播数据的发送端,需要先设置组播属性,发送的数据是通过sendto()函数发送到某一个组播地址上,并且在程序中数据发送到了接收端的9999端口,因此接收端程序必须要绑定这个端口才能收到组播消息。注意事项:作为组播消息的接收端,必须要先绑定一个固定端口(发送端就可以把数据发送到这个固定的端口上了),然后加入到组播的群组中(一个组播地址可以看做是一个群组),这样就可以接收到组播消息了。optval:加入到多播组,这个指针应该指向一个struct ip_mreqn{}类型的结构体地址。

2023-08-25 09:08:03 1756

原创 UDP特性之广播

UDP的广播和日常生活中的广播是一样的,都是一种快速传播消息的方式,因此广播的开销很小,发送端使用一个广播地址,就可以将数据发送到多个接收数据的终端上,如果不使用广播,就需要进行多次发送才能将数据分别发送到不同的主机上。对于接收广播消息的一端,必须要绑定固定的端口,并由广播端将广播消息发送到这个端口上,因此所有接收端都应绑定相同的端口,这样才能同时收到广播数据。只要发送端在发送广播消息,数据接收端就能收到广播消息,消息的接收是无法拒绝的,除非将接收端的进程关闭,就接收不到了。

2023-08-20 16:48:27 1451 1

原创 基于UDP的套接字通信

作为数据接收端,服务器端通过bind()函数绑定了固定的端口,然后基于这个固定的端口通过recvfrom()函数接收客户端发送的数据,同时通过这个函数也得到了数据发送端的地址信息(recvfrom的第三个参数),这样就可以通过得到的地址信息通过sendto()函数给客户端回复数据了。在UDP通信过程中,哪一端是接收数据的角色,那么这个接收端就必须绑定一个固定的端口,如果某一端不需要接收数据,这个绑定操作就可以省略不写了,通信的套接字会自动绑定一个随机端口。

2023-08-20 16:47:47 173

原创 Linux IO多路转接(复用)之epoll

通过上述分析就可以得出一个结论:epoll在边沿模式下,必须要将套接字设置为非阻塞模式,但是,这样就会引发另外的一个bug,在非阻塞模式下,循环地将读缓冲区数据读到本地内存中,当缓冲区数据被读完了,调用的read()/recv()函数还会继续从缓冲区中读数据,此时函数调用就失败了,返回-1,对应的全局变量 errno 值为 EAGAIN 或者 EWOULDBLOCK如果打印错误信息会得到如下的信息:Resource temporarily unavailable。

2023-08-20 16:46:48 143

原创 IO多路转接(复用)之poll

从上面的测试代码可以得知,使用poll和select进行IO多路转接的处理思路是完全相同的,但是使用poll编写的代码看起来会更直观一些,select使用的位图的方式来标记要委托内核检测的文件描述符(每个比特位对应一个唯一的文件描述符),并且对这个fd_set类型的位图变量进行读写还需要借助一系列的宏函数,操作比较麻烦。poll和select检测的文件描述符集合会在检测过程中频繁的进行用户区和内核区的拷贝,它的开销随着文件描述符数量的增加而线性增大,从而效率也会越来越低。/* 委托内核检测的文件描述符。

2023-08-20 16:45:16 92

原创 IO多路转接(复用)之select

rdset用于保存要检测的原始数据,这个变量不能作为参数传递给select函数,因为在函数内部这个变量中的值会被内核修改,函数调用完毕返回之后,里边就不是原始数据了,大部分情况下是值为1的标志位变少了,不可能每一轮检测,所有的文件描述符都是就行的状态。内核在遍历这个读集合的过程中,如果被检测的文件描述符对应的读缓冲区中没有数据,内核将修改这个文件描述符在读集合fd_set中对应的标志位,改为0,如果有数据那么这个标志位的值不变,还是1。这并不是巧合,而是故意为之。

2023-08-20 16:44:32 80

原创 IO多路转接(复用)之select

rdset用于保存要检测的原始数据,这个变量不能作为参数传递给select函数,因为在函数内部这个变量中的值会被内核修改,函数调用完毕返回之后,里边就不是原始数据了,大部分情况下是值为1的标志位变少了,不可能每一轮检测,所有的文件描述符都是就行的状态。内核在遍历这个读集合的过程中,如果被检测的文件描述符对应的读缓冲区中没有数据,内核将修改这个文件描述符在读集合fd_set中对应的标志位,改为0,如果有数据那么这个标志位的值不变,还是1。这并不是巧合,而是故意为之。

2023-08-20 16:43:49 117

原创 手把手教你撸一个线程池 - C++版

另外一个类TaskQueue是任务队列,提供了添加任务、取出任务、存储任务、获取任务个数、线程同步的功能。链接: https://subingwen.cn/linux/threadpool-cpp/// 判断任务队列是否为空, 如果为空工作线程阻塞。// 添加任务,不需要加锁,任务队列中有锁。// 取出线程池中的任务数和线程数量。// 工作的线程的任务函数。// 管理者线程的任务函数。// 唤醒所有消费者线程。// 管理者线程任务函数。// 工作线程任务函数。// 定义任务结构体。// 实例化任务队列。

2023-08-20 16:43:14 50

原创 手把手教你撸一个线程池 - C++版

另外一个类TaskQueue是任务队列,提供了添加任务、取出任务、存储任务、获取任务个数、线程同步的功能。链接: https://subingwen.cn/linux/threadpool-cpp/// 判断任务队列是否为空, 如果为空工作线程阻塞。// 添加任务,不需要加锁,任务队列中有锁。// 取出线程池中的任务数和线程数量。// 工作的线程的任务函数。// 管理者线程的任务函数。// 唤醒所有消费者线程。// 管理者线程任务函数。// 工作线程任务函数。// 定义任务结构体。// 实例化任务队列。

2023-08-20 16:41:38 50

原创 Linux手写线程池 - C语言版

如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。线程池中维护了一定数量的工作线程, 他们的作用是是不停的读任务队列, 从里边取出任务并处理。线程池的使用者,也就是调用线程池函数往任务队列中添加任务的线程就是生产者线程。它的任务是周期性的对任务队列中的任务数量以及处于忙状态的工作线程个数进行检测。// 忙的线程的个数。

2023-08-20 16:39:59 74

原创 C++线程的使用

在某个线程中通过子线程对象调用join()函数,调用这个函数的线程被阻塞,但是子线程对象中的任务函数会继续执行,当任务执行完毕之后join()会清理当前子线程中的相关资源然后返回,同时,调用该函数的线程解除阻塞继续向下执行。在子线程调用了join()函数,子线程中的任务函数继续执行,直到任务处理完毕,这时join()会清理(回收)当前子线程的相关资源,所以这个子线程和主线程的连接也就断开了,因此,调用join()之后再调用joinable()会返回false。” << endl;” << endl;

2023-08-20 16:38:50 138

原创 Linux多线程

./a.out子线程创建成功, 线程ID: 139712560109312我是主线程, 线程ID: 139712568477440i = 0i = 1i = 2在打印的日志输出中为什么子线程处理函数没有执行完毕呢(只看到了子线程的部分日志输出)?主线程一直在运行, 执行期间创建出了子线程,说明主线程有CPU时间片, 在这个时间片内将代码执行完毕了, 主线程就退出了。

2023-08-20 16:38:00 46

原创 Linux守护进程

一般采用以d结尾的名字。进程组中的成员是可以转移的,如果当前进程组中的成员被转移到了其他的组,或者进制中的所有进程都退出了,那么这个进程组也就不存在了。重定向文件描述符(和关闭二选一): 改变文件描述符关联的默认文件, 让他们指向一个特殊的文件/dev/null,只要把数据扔到这个特殊的设备文件中, 数据被被销毁了。如果pgid对应的进程组不存在,会创建一个新的进程组, 因此要求 pid == pgid, 当前进程就是组长了。这个进程会变成当前会话中的第一个进程,同时也会变成新的进程组的组长。

2023-08-20 16:36:39 133

原创 Linux信号

在Linux中的很多常规操作中都会有相关的信号产生,先从我们最熟悉的场景说起:通过键盘操作产生了信号:用户按下Ctrl-C,这个键盘输入产生一个硬件中断,使用这个快捷键会产生信号, 这个信号会杀死对应的某个进程通过shell命令产生了信号:通过kill命令终止某一个进程,kill -9 进程PID通过函数调用产生了信号:如果CPU当前正在执行这个进程的代码调用,比如函数 sleep(),进程收到相关的信号,被迫挂起。

2023-08-20 16:35:21 99

原创 Linux信号

在Linux中的很多常规操作中都会有相关的信号产生,先从我们最熟悉的场景说起:通过键盘操作产生了信号:用户按下Ctrl-C,这个键盘输入产生一个硬件中断,使用这个快捷键会产生信号, 这个信号会杀死对应的某个进程通过shell命令产生了信号:通过kill命令终止某一个进程,kill -9 进程PID通过函数调用产生了信号:如果CPU当前正在执行这个进程的代码调用,比如函数 sleep(),进程收到相关的信号,被迫挂起。

2023-08-20 16:34:48 64

原创 Linux共享内存

共享内存不同于内存映射区,它不属于任何进程,并且不受进程生命周期的影响。通过调用Linux提供的系统函数就可得到这块共享内存。使用之前需要让进程和共享内存进行关联,得到共享内存的起始地址之后就可以直接进行读写操作了,进程也可以和这块共享内存解除关联, 解除关联之后就不能操作这块共享内存了。在所有进程间通信的方式中共享内存的效率是最高的。共享内存操作默认不阻塞,如果多个进程同时读写共享内存,可能出现数据混乱,共享内存需要借助其他机制来保证进程间的数据同步,比如:信号量,共享内存内部没有提供这种机制。C。

2023-08-20 16:32:01 99

原创 Linux内存映射(mmap)

如上图所示:磁盘文件数据可以完全加载到进程的内存映射区也可以部分加载到进程的内存映射区,当进程A中的内存映射区数据被修改了,数据会被自动同步到磁盘文件,同时和磁盘文件建立映射关系的其他进程内存映射区中的数据也会和磁盘文件进行数据的实时同步,这个同步机制保障了各个进程之间的数据共享。由于每个进程的地址空间是独立的,各个进程之间也不能直接访问对方的内存映射区,需要通信的进程需要将各自的内存映射区和同一个磁盘文件进行映射,这样进程之间就可以通过磁盘文件这个唯一的桥梁完成数据的交互了。

2023-08-20 16:30:11 164

原创 Linux管道

有名管道拥有管道的所有特性,之所以称之为有名是因为管道在磁盘上有实体文件, 文件类型为p ,有名管道文件大小永远为0,因为有名管道也是将数据存储到内存的缓冲区中,打开这个磁盘上的管道文件就可以得到操作有名管道的文件描述符,通过文件描述符读写管道存储在内核中的数据。不管是有血缘关系还是没有血缘关系,使用有名管道实现进程间通信的方式是相同的,就是在两个进程中分别以读、写的方式打开磁盘上的管道文件,得到用于读管道、写管道的文件描述符,就可以调用对应的read()、write()函数进行读写操作了。

2023-08-20 16:28:33 91

原创 Linux进程控制

程序:就是磁盘上的可执行文件文件, 并且只占用磁盘上的空间,是一个静态的概念。进程:被执行之后的程序叫做进程,不占用磁盘空间,需要消耗系统的内存,CPU资源,每个运行的进程的都对应一个属于自己的虚拟地址空间,这是一个动态的概念。虚拟地址空间详解1.1 并行和并发CPU时间片CPU在某个时间点只能处理一个任务,但是操作系统都支持多任务的,那么在计算机CPU只有一个和的情况下是怎么完成多任务处理的呢?原理和古时候救济灾民的思路是一样的,每个人分一点,但是又不叫吃饱。

2023-08-20 16:26:59 96

原创 linux目录遍历

众所周知,Linux的目录是一个树状结构,了解数据结构的小伙伴都明白,遍历一棵树最简单的方式是递归。在我们已经掌握了递归的使用方法之后,遍历树状目录也不是一件难事儿。Linux给我们提供了相关的目录遍历的函数,分别为:opendir(), readdir(), closedir()。目录的操作方式和标准C库提供的文件操作步骤是类似的。下面来依次介绍一下这几个函数。C1234// 打开目录name);参数: name -> 要打开的目录的名字返回值: DIR。

2023-08-20 16:24:43 1327

原创 Linux系统文件IO

每个系统都有自己的专属函数,我们习惯称其为系统函数。系统函数并不是内核函数,因为内核函数是不允许用户使用的,系统函数就充当了二者之间的桥梁,这样用户就可以间接的完成某些内核操作了。在前面介绍了文件描述符,在Linux系统中必须要使用系统提供的IO函数才能基于这些文件描述符完成对相关文件的读写操作。这些Linux系统IO函数和标准C库的IO函数使用方法类似,函数名称也类似,下边开始一一介绍。

2023-08-20 16:18:03 62

转载 android 摇一摇+震动+声音效果

android 摇一摇+震动+声音效果摇一摇红包效果已经是老生常谈的了,利用手机的传感器识别摇一摇,同时过程中进行动画+震动+声音的效果。Ps:百度网页版「摇一摇」三个字,会有效果的,皮一哈!效果图:摇一摇主要通过SensorManager监听手机,实现 SensorEventListener,在onSensorChanged去判断,根据加速度来判断摇晃的程度。ShakeSensorLis...

2019-11-14 10:33:19 256

空空如也

空空如也

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

TA关注的人

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