- 博客(19)
- 收藏
- 关注
原创 C++11线程
在 C++11 之前,C++没有对线程提供语言级别的支持,各种操作系统和编译器实现线程的方法不一样。C++11 增加了线程以及线程相关的类,统一编程风格、简单易用、跨平台。
2024-02-02 18:37:01
1415
原创 C++文件操作基础 读写文本、二进制文件 输入输出流 文件位置指针以及随机存取 文件缓冲区以及流状态
文本文件一般以行的形式组织数据。ofstream 打开文件的模式(方式):类内open()成员函数参数2.参数1是文件存储/创建路径例如:fout.open(filename,ios::app);对于 ofstream,不管用哪种模式打开文件,如果文件不存在,都会创建文件。缺省值:会截断文件内容。截断文件内容。(truncate)不截断文件内容,只在文件未尾追加文件。(append)主要关注路径与文件名书写方法,推荐使用原始字面量和绝对路径,还有打开写入关闭等操作。
2024-01-25 15:43:19
1971
原创 C++11时间操作chrono库
C++11 提供了 计时码表 模版库,实现了一系列时间相关的操作(时间长度、系统时间和计时器)。命名空间:std::chrono。
2024-01-23 15:26:10
877
1
原创 vector容器、迭代器、基于范围的for循环
迭代器是访问容器中元素的通用方法。如果使用迭代器,不同的容器,访问元素的方法是相同的。迭代器支持的基本操作:赋值(=)、解引用(*)、比较(==和!=)、从左向右遍历(++)。一般情况下,迭代器是指针和移动指针的方法。迭代器一般有五种:1)正向迭代器只能使用++运算符从左向右遍历容器,每次沿容器向右移动一个元素。容器名::iterator 迭代器名;// 正向迭代器。容器名::const_iterator 迭代器名;// 常正向迭代器。
2024-01-22 15:55:13
1509
原创 string容器全(C++)
string 是字符容器,内部维护了一个动态的字符数组。与普通的字符数组相比,string 容器有1)使用的时候,不必考虑内存分配和释放的问题;2)动态管理内存(可扩展);3)提供了大量操作容器的 API。缺点是效率略有降低,占用的资源也更多。string 类是 std::basic_string 类模板的一个具体化版本的别名。
2024-01-20 16:30:57
1323
原创 TCP缓存(C++)
在 TCP 协议中,无论发送多少数据,都要在数据前面加上协议头,同时,对方收到数据后,也需要回复 ACK 表示确认。向发送端回复 ACK,而是延迟 40ms 后再回复,它希望在 40ms 内接收端会向发送端回复应答数据,这样 ACK 就可以和应答数据一起发送,把 ACK 捎带过去。块),这时候,A 块的 ACK 没有返回(已经存在了一个未被确认的小段),所以 B 块不会立即被发送,而是等 A 块的 ACK 返回之后(大概 40ms)才发送。块,未被确认是指一个数据块发送出去后,没有收到对端回复的 ACK。
2024-01-19 17:50:06
724
1
原创 三次握手和四次挥手(简单C++通讯模型程序内外以及包含简单函数的背后应该知道)
TCP 是面向连接的、可靠的协议,建立 TCP 连接需要三次对话(三次握手),拆除 TCP 连接需要四次对话(四次握/挥手)。
2024-01-19 01:26:18
1344
1
原创 网络编程基础 一个简单的网络通讯模型进阶(封装socket客户端/服务端,多进程的服务端,实现文件传输功能)
一对一的客户/服务端在实际应用中几乎没有,所以下一步是把服务端升级为多进程的,就像生活中可以用不同的设备、途径去访问一个后台程序。在精简的模型基础上将不断受理客户端连接的部分作为父进程,与不同IP的客户端通讯的部分作为子进程,也就是一个服务端受理多个客户端,则客户端的模型不用改动。这样一个简单的网络通讯演示模型基本基本就完成了,它有了最简单基础的客户端与服务端的通讯功能,在更深入的学习后会优化成功能更多更强大更合理的真正的网络通讯程序。实现文件传输功能,支持客户端向服务端发送文本文件或二进制文件。
2024-01-17 19:05:21
1260
原创 网络编程:写一个简单的网络通讯模型之前应该知道( socket函数 主机字节序和网络字节序 相关函数参数用到的结构体解读)
PF_INET IPv4 互联网协议族。PF_INET6 IPv6 互联网协议族。PF_LOCAL 本地通信的协议族。PF_PACKET 内核底层的协议族。PF_IPX IPX Novell 协议族。IPv6 尚未普及,其它的不常用,主要是IPv4。
2024-01-14 20:22:36
1434
1
原创 共享内存的数据结构 ——循环队列+信息量 ——互斥锁、多进程的消费者模型 源码模型 测试代码 C++
简单来说,共享内存不能自动扩展,申请多少就是多少,而且只能用C++内置的数据类型。也不能用STL容器,例如vector会自动扩展,容易造成内存泄漏,越界等问题。移动语义也不能用。要想实现多进程的生产/消费者模型只能采用循环队列。
2024-01-12 19:06:02
733
1
原创 Linux 进程终止 程序内调用其他可执行程序 创建进程 僵尸进程 多进程与信号(c++)
父进程如果处理了子进程退出的信息,内核就会释放这个数据结构,父进程如果没有处理子进程退出的信息,内核就不会释放这个数据结构,子进程的进程编号将一直被占用。1)父进程复制自己,然后,父进程和子进程分别执行不同的代码。这种用法在网络服务程序中很常见,父进程等待客户端的连接请求,当请求到达时,父进程调用 fork(),让子进程处理些请求,而父进程则继续等待下一个连接请求。在多进程的服务程序中,如果子进程收到退出信号,子进程自行退出,如果父进程收到退出信号,则应该先向全部的子进程发送退出信号,然后自己再退出。
2024-01-12 15:52:33
1260
1
原创 共享内存的函数操作
共享内存没有提供锁机制,也就是说,在某一个进程对共享内存进行读/写的时候,不会阻止其它进程对它的读/写。共享内存的访问权限,与文件的权限一样,例如 0666|IPC_CREAT,0666 表示全部用户对它可读写,可以查看系统的共享内存,包括:键值(key),共享内存 id(shmid),拥有者(ow。在多进程中,每个进程的地址空间是独立的,不共享的,如果多个进程需要访问同一块内存,不能。buf 操作共享内存的数据结构的地址,如果要删除共享内存,填 0。该函数用于操作共享内存,最常用的操作是删除共享内存。
2024-01-11 18:20:44
1187
1
原创 Linux的信号(C++)
信号(signal)是软件中断,是进程之间相互传递消息的一种方法,用于通知进程发生了某事件,但是不能给给进程传递任何数据。func1将参数signum也就是信号编号的处理方式自定义为输出"接收到信号+编号",然后重新设置该信号的处理函数为。D 缺省的动作是停止进程,进入停止状态的程序还能重新继续,一般是在调试的过程中。将信号传给和当前进程相同进程组的所有进程,常用于父进程给子进程发送信号,注。2)一个自定义的处理信号的函数,函数的形参是信号的编号。B 缺省的动作是忽略此信号,将该信号丢弃,不做处理。
2024-01-11 16:12:42
1372
1
原创 LInux的系统错误(C++)
并不是全部的库函数在调用失败时都会设置 errno 的值,以 man 手册为准(一般来说,不属于系。errno 的值只有在库函数调用发生错误时才会被设置,当库函数调用成功时,errno 的值不会被修。如果调用库函数失败,可以通过 errno 的值来查找原因,这也是调试程序的一个重要方法。实际上,判断函数执行是否成功还得靠函数的返回值,只有在返回值是失败的情况下,才需。统调用的函数不会设置 errno,属于系统调用的函数才会设置 errno)。两个库函数,可以查看出错的详细信息。改,不会主动的置为 0。
2024-01-11 01:51:03
571
1
原创 Linux的目录操作函数(C++)
pathname-目录名,mode-访问权限,如 0755,不要省略前置的 0,如果不了解先查阅关于用户权限rwx数字表示的内容。返回值的话如果pathname需要判断的权限mode确实满足返回0,不满足返回-1。remove()函数用于删除目录或文件,相当于操作系统的 rm 命令。返回值:0-成功,-1-失败,errno 被设置。返回值:0-成功,-1-失败,errno 被设置。返回值:0-成功,-1-失败,errno 被设置。返回值:0-成功,-1-失败,errno 被设置。
2024-01-11 01:15:02
1680
1
原创 Linux时间操作函数(C++)获取时间 转换时间 C++计时 程序睡眠
转换:先解析时间字符串,转换回结构体格式,然后用该库函数转换回time_t长整数格式,之后比如说加一刻钟(15分钟),就是time_t时间+15*60,然后参见上述localtime()函数转换为字符串格式就完成了。UNI操作系统将1970年1月1日作为纪元时间,将从1970年1月1日0分0秒起至今的秒数作为一个整数存放。返回的都是结构体指针,_r库函数参数1是time_t长整数指针,参数2是用于存放结果的结构体指针。作用与localtime()相反,是将结构体转换回time_t时间。
2024-01-10 15:25:47
1138
原创 gdb的常用命令,调试core文件,调试程序(C++)
关注core file size(第一行),此外可以重点关注open fils,stack size这两个参数,根据字面意思也不难猜测,了解一下他们,此处不做赘述。状态将保存在 core 文件中,方便进一步分析。如果程序在运行的过程中发生了内存泄漏,会被内核强行终止,提示“段错误(吐核)”,内存的。之后的调试按照上述步骤进行即可,注意,需要先确认目录中有了core文件,然后。调试的时候跑着的程序会停下来,剩下的调试操作详见上述普通调试的内容。基本的gbd使用方法就是这样了。bt显示no stack。
2024-01-10 00:41:06
931
原创 linux编译规则文件makefile的编写,使用方法
先来看开头用类似于宏常量的字符代替了编译过程的一些目录,认真看第一行是I(大写)开头的,不难猜到是关于头文件的,具体原因来源于库文件中头文件的引用问题,多了就不赘述了,如果是看过我的关于库的文章,是免除在库文件引用头文件时添加路径的不必要不规范不安全的操作,还有关于引用多个库的问题,都是按照格式依次添加就行,有几个写几个。简单的makefile就是这样了,从一个到多个库文件,demo1 demo2 demo3可以随意写多少,随意用你的库,多个程序都是一样的。结尾是clean命令的内容,简单粗暴的删除命令。
2024-01-09 01:37:39
618
原创 Linux 静态库文件和动态库文件的使用、生成和注意事项(C++版)
然后./demo执行程序测试,在没有创建makefile的情况下,在库文件.cpp或你其他文件里引用声明.h文件的话,在头文件的声明中可以这样先凑合用:#include"public.h/它的绝对路径",不过这种方法在熟悉makefile的情况下不建议使用,不规范且不安全,仅供测试学习暂时替用。关于库的概念,简而言之就是将函数或类分文件编写为库,方便程序调用,而在实际中并不会提供源代码文件给执行程序,而是给出库的二进制文件(安全性等原因),分为静态库和动态库。然后执行demo程序时。
2024-01-09 00:33:09
856
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅