<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[bhbca的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/bhbca</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; bhbca]]></copyright><item><title><![CDATA[Linux高级IO_select、epoll]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136752696</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136752696</guid><author>bhbca</author><pubDate>Fri, 15 Mar 2024 23:50:45 +0800</pubDate><description><![CDATA[调用这些IO接口进行网络通信时，需要等待IO条件满足（IO事件就绪）才能正常拷贝数据。比如调用send/write需要等待TCP的发送缓冲区有剩余空间才能将数据拷贝到TCP发送缓冲区中，调用read/recv需要等待TCP的接收缓冲区有数据才能将数据拷贝到应用层，即IO=等+数据拷贝，而这些等待是由用户来完成的，高级IO就是降低用户等的时间以提高IO效率。常见的五种IO模型有：阻塞IO、非阻塞IO、信号驱动IO、多路复用/多路转接、异步IO（让操作系统进行IO）。]]></description><category></category></item><item><title><![CDATA[数据链路层_以太网]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136752687</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136752687</guid><author>bhbca</author><pubDate>Fri, 15 Mar 2024 23:49:43 +0800</pubDate><description><![CDATA[IP协议确定数据跨网络从主机A到主机B的路径，即IP协议解决了路径选择问题，但在这之前，必须先解决数据在一个子网内的传输的问题。跨网络的本质就是跨多个子网，只要一个子网内可以通信，那么便可以跨网络通信。]]></description><category></category></item><item><title><![CDATA[网络层_IP]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136752673</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136752673</guid><author>bhbca</author><pubDate>Fri, 15 Mar 2024 23:48:52 +0800</pubDate><description><![CDATA[传输层解决的是传输控制，而实际真正决定数据能否发送到对端的是网络层。网络层是有概率传输，而传输层是可靠性传输。所以传输层+网络层就可以做到将数据可靠发送到对端。网络层的常见协议有：IP、ICMP等，其中最重要的是IP协议，IP协议有IP4v和IPv6两种，目前用的最多的是IPv4.]]></description><category></category></item><item><title><![CDATA[传输层_TCP&UDP]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136752662</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136752662</guid><author>bhbca</author><pubDate>Fri, 15 Mar 2024 23:48:15 +0800</pubDate><description><![CDATA[应用层中调用这些系统接口，并没有将数据发送到网络中，而是向下交付到传输层协议，具体什么时候发送数据，由传输层根据一些策略进行数据的实际发送。传输层的主要功能就是数据的传输，包括如果数据丢失，重复，乱序，发送太快太慢等等一些数据传输可靠性问题。传输层就是根据用户的要求从而解决数据传输的问题。传输层的协议主要由TCP和UDP两种协议。TCP协议是可靠传输的，如果用户想要更可靠的传输就用TCP协议；如果用户追求效率，那么可以使用UDP协议，它是不可靠的，没有面向连接的，因此速度会比TCP协议快一些。]]></description><category></category></item><item><title><![CDATA[应用层_HTTP&HTTPS]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136752638</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136752638</guid><author>bhbca</author><pubDate>Fri, 15 Mar 2024 23:46:27 +0800</pubDate><description><![CDATA[将一串文本经过hash算法后，形成固定大小的字符串，这个字符串具有很强的唯一性。这个字符串就是数据摘要，数据指纹。对数据摘要加密就得到了数字签名。可以通过数据摘要判断原始文本是否被篡改常见的摘要算法：MD5，SHA1，SHA512等。]]></description><category></category></item><item><title><![CDATA[Linux_socket编程]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136752626</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136752626</guid><author>bhbca</author><pubDate>Fri, 15 Mar 2024 23:44:51 +0800</pubDate><description><![CDATA[根据ip地址我们可以定位一台主机，而根据端口号（port）可以定位一台主机上的一个进程。众所周知，服务器是需要一直运行的，所以服务器不能用用户进行命令行解释的会话来运行，而需要单独成一个会话，这个会话不能轻易退出。采用端口号而不是pid来标识进程的原因是降低网络和进程管理的耦合度，同时也更好的区分了网络进程。一个端口号只能对应一个进程，但是一个进程可以对应多个端口号。套接字通信主要编写的是应用层的程序，使用os提供的网络部分的系统调用进行发送和接收消息。一个会话内有许多进程组，一个进程组内有许多进程。]]></description><category></category></item><item><title><![CDATA[Linux_初识网络协议]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136752610</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136752610</guid><author>bhbca</author><pubDate>Fri, 15 Mar 2024 23:43:31 +0800</pubDate><description><![CDATA[网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。说白了，协议就是通信双方的约定，建立协议是为了减少后期的沟通成本，提高通信效率，解决通信问题。比如购房时签订了协议，有了这份协议在发生纠纷时就很容易解决。在Linux中，协议就是一个c程序（软件）。]]></description><category></category></item><item><title><![CDATA[Linux_线程]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136107895</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136107895</guid><author>bhbca</author><pubDate>Tue, 13 Feb 2024 17:06:01 +0800</pubDate><description><![CDATA[12 = 4KB）页目录共有1024行，每个页表项也有1024行，共可以映射2^20页地址，这恰好是内存中页的数量，页表映射出物理页号，物理页号和虚拟地址中的12位页内偏移组合，构成物理字节地址。由于程序不可能使用整个内存，所以页表不会一次全部创建，而是创建一部分。]]></description><category></category></item><item><title><![CDATA[Linux_信号]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136107868</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136107868</guid><author>bhbca</author><pubDate>Tue, 13 Feb 2024 17:05:16 +0800</pubDate><description><![CDATA[综上所述，要学习信号，就要从信号的产生，信号的保存，信号的处理三个方面着手。在Linux中，可以用。]]></description><category></category></item><item><title><![CDATA[Linux_进程间通信]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136107848</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136107848</guid><author>bhbca</author><pubDate>Tue, 13 Feb 2024 17:01:43 +0800</pubDate><description><![CDATA[创建共享内存：shmgetkey：一个整数，多个进程只要保证调用shmget时，传递相同的key，就可以保证打开同一个共享内存。获取key可以用ftok函数，其中参数是自己设定的size：共享内存的实际可用大小。操作系统分配是以4KB为单位的。shmflg：位图结构体，常用的宏：IPC_CREAT IPC_EXCL，也可以设置共享内存的权限返回值：返回一个shmid值shmid与key的关系。shmid和key的关系，类似于文件inode编号和fd的关系。]]></description><category></category></item><item><title><![CDATA[Linux_动静态库]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136107836</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136107836</guid><author>bhbca</author><pubDate>Tue, 13 Feb 2024 16:59:24 +0800</pubDate><description><![CDATA[刚开始学编程时，需要下载一个环境（vs2019），这个环境包括编译器和标准库，标准头文件。那么什么是库呢，库和头文件有什么关系呢？在Linux中静态库通常命名为libxxx.a，动态库通常命名为libxxx.so，但库的名字是去掉前缀lib和后缀后的字符串。比如libc.so 这个库的真实名字就是c。]]></description><category></category></item><item><title><![CDATA[Linux_文件系统]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136107822</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136107822</guid><author>bhbca</author><pubDate>Tue, 13 Feb 2024 16:58:38 +0800</pubDate><description><![CDATA[假定外部存储设备为磁盘，文件如果没有被使用，那么它静静躺在磁盘上，如果它被使用，则文件将被加载进内存中。故此，可以将文件分为内存文件和磁盘文件。]]></description><category></category></item><item><title><![CDATA[Linux_环境变量_命令行参数]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136107816</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136107816</guid><author>bhbca</author><pubDate>Tue, 13 Feb 2024 16:57:01 +0800</pubDate><description><![CDATA[在bash上运行的程序都是bash的子进程，在创建子进程时，父进程将它的环境变量表传递到子进程中，所以子进程可以访问环境变量表，这也说明了环境变量表具有全局属性，但是bash中的本地变量不能传递给子进程，只能在bash内部使用。像ls，touch这样的命令，它的路径已经存放在了对应的PATH环境变量里，我们自己写的程序的路径没有在PATH中，所以在查找时，找不到就报错了。在Linux中自己写的程序必须要带路径才能运行，相对路径或是绝对路径，但是像ls pwd这样的程序，不带路径也能运行。]]></description><category></category></item><item><title><![CDATA[Linux_进程地址空间]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136107805</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136107805</guid><author>bhbca</author><pubDate>Tue, 13 Feb 2024 16:55:42 +0800</pubDate><description><![CDATA[进程地址空间，即虚拟地址空间。一个进程运行时，它所认为自己管理的空间就是虚拟地址空间，一个进程地址空间的大小取决于计算机系统架构，比如32位机，进程地址空间为4GB。]]></description><category></category></item><item><title><![CDATA[Linux_进程概念]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136107779</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136107779</guid><author>bhbca</author><pubDate>Tue, 13 Feb 2024 16:54:00 +0800</pubDate><description><![CDATA[但是仅仅知道该名学生的数据还不够，如果只有1名学生，这样的管理明显是可以的，但是如果有3万名学生呢，就算知道了这些学生的数据也不好管理，此时我们可以将这些学生的信息抽象成一个结构体，然后对于每一名学生构建一个结构体对象，然后使用链表，树等其他数据结构，组织这些结构体对象。操作系统对进程的管理，就转换为对这些PCB的管理。当一个进程状态是阻塞时，操作系统在内存不足的情况下，会将该进程对应的代码和数据，暂时交换到磁盘中，在磁盘中这块空间也叫做swap分区（外存），等资源就绪后，再将代码和数据交换回来。]]></description><category></category></item><item><title><![CDATA[Linux_进程]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/136107759</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/136107759</guid><author>bhbca</author><pubDate>Tue, 13 Feb 2024 16:49:10 +0800</pubDate><description><![CDATA[execlpath：执行程序的路径，arg：表示执行程序名字，…：可变参数列表，同printf，写命令行选项，以NULL结尾返回值：当函数有返回值时，必定替换失败execlpfile：执行程序的名字，系统会在默认环境变量PATH中查找程序其余同上execleenvp ：父进程可以将自己的环境变量表传递给子进程。execvargv：表示将上述的arg和可变参数列表，放入指针数组execvpexecvpeexecve。]]></description><category></category></item><item><title><![CDATA[c++异常]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/132054055</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/132054055</guid><author>bhbca</author><pubDate>Wed, 02 Aug 2023 08:30:17 +0800</pubDate><description><![CDATA[实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理，因为一个项目中如果大家随意抛异常，那么外层的调用者基本就没办法玩了，所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象，捕获一个基类就可以了（基类与派生类的赋值兼容规则转换），通常这些还会实现为多态，在异常处理时，只要调用虚函数即可。1// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:int _id;]]></description><category></category></item><item><title><![CDATA[c++智能指针]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/132054045</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/132054045</guid><author>bhbca</author><pubDate>Wed, 02 Aug 2023 08:29:09 +0800</pubDate><description><![CDATA[c++98的做法是实现auto_ptr，但两个指针进行拷贝/赋值时，进行控制权转移，但是这样情况会导致被转移的智能指针悬空，但使用者不知道，如果使用者使用悬空指针，则会出现解引用空指针的问题，所以这种方法基本没人会使用。c++11的做法是对于不需要拷贝的智能指针实现unique_ptr，需要实现拷贝的智能指针实现shared_ptr/weak_ptr。解决了上述问题，但还不够，因为普通指针可以进行浅拷贝，我们上述的智能指针不能浅拷贝，会造成delete野指针问题。就会出错，如何解决这种问题呢？]]></description><category></category></item><item><title><![CDATA[c++特殊类的设计]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/132054042</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/132054042</guid><author>bhbca</author><pubDate>Wed, 02 Aug 2023 08:28:36 +0800</pubDate><description><![CDATA[设计模式（Design Pattern）是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。常见的设计模式有：适配器模式，迭代器模式，工厂模式，观察者模式，单例模式(只能创建一个对象)2.如果两个单例对象有依赖关系，那么用饿汉模式就无法控制对象创建顺序。法一：饿汉模式，饿汉这里只能是对象指针，不能是对象，因为要禁用拷贝构造，所以不能返回。1.在main函数之前就会创建对象，会拖慢程序的启动速度。可以解决饿汉的缺点，但比饿汉复杂，并且有线程安全问题。懒汉模式：程序第一次调用对象时，创建对象。]]></description><category></category></item><item><title><![CDATA[c++类型转换]]></title><link>https://blog.youkuaiyun.com/bhbca/article/details/132054039</link><guid>https://blog.youkuaiyun.com/bhbca/article/details/132054039</guid><author>bhbca</author><pubDate>Wed, 02 Aug 2023 08:28:06 +0800</pubDate><description><![CDATA[在C语言中，如果赋值运算符左右两侧类型不同，或者形参与实参类型不匹配，或者返回值类型与接收返回值类型不一致时，就需要发生类型转化，C语言中总共有两种形式的类型转换：隐式类型转换和显式类型转换c语言的转换规则会导致：数据精度的丢失和代码不够清晰，所以c++提出了四种类型转换：static_case, reinterpret_cast, const_cast, dynamic_cast
static_cast功能和隐式类型转换一致，支持意义相近的类型转换。
reinterpret_cast功能类似于强制类型转换]]></description><category></category></item></channel></rss>