- 博客(152)
- 收藏
- 关注
原创 Linux守护进程
setsid()创建一个新的会话。(必须是组员进程才可以创建一个新的会话)5.umask(0)清除掩码,不让掩码修改权限。原因就是创建了一个新的会话,脱离了原会话。组长进程:第一个启动的进程叫组长进程。4.chdir("/")改到根目录底下。一个文件最多保存1024个文件描述符。关闭终端:进程组里全部进程关闭。守护进程 Linux/Unix。1.先fork(),退出父进程。2.setsid()创建新会话。3.fork(),退出父进程。
2023-05-30 18:24:40
830
原创 Shell编程
z string 如果字符串为null(一个空串)则结果为真。-e file 如果文件存在则结果为真。= string2 如果两个字符串不同则结果为真。$$ shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件。c/c++编译型 xx.c->xx 二进制机器指令。-f file 如果文件是一个普通文件则结果为真。-d file 如果文件是一个目录则结果为真。"$a"就是打印出a的值 '$a'就是打印出$a。
2023-05-19 22:46:44
769
原创 Mysql的事物
所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如 :银行转账的问题,从一个账号扣款并使另一个账号入账,这两个操作要么都执行,要么都不执行。开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中。查看表的引擎类型,必须是innodb类型才可以使用事务。或 start transaction;REPEATABLE READ 可重复读。1.什么是事物,为什么需要事物。2.事物四大特性(ACID)原子性(atomicity)隔离性(isolation)
2023-05-19 14:10:48
692
原创 lambda 表达式
6.[this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项,捕获this的目的是可以在lambda中使用当前类的成员函数和成员变量。声明式编译风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象,已更直接的方式去写程序,好的可读性和可维护性。简洁:不需要额外再写一个函数或者函数对象,避免了代码的膨胀和功能分散,让开发者更加集中精力在手边的问题,同时也获得了更高的生产率。其中:capture是捕获列表;
2023-05-18 13:41:16
611
原创 C++面经:初始化全局变量和未初始化全局变量有什么区别
全局变量初始化而且初始值不为0,那么这样的全局变量是放在内存的.data段的,如果全局变量初始值为0或者未初始化,那么这样的全局变量是放在.bss段的。(1).全局变量区和静态变量区的存储是返回在一块的,初始化的全局变量和静态变量在一块区域。未初始化的全局变量和未初始化的静态变量在相邻的另一区域。注意:未初始化的全局变量的默认值是 0,而未初始化的局部变量的值却是垃圾值(任意值)。注意:这里的堆区不同于数据结构的堆,堆区的分配方式倒是和数据结构的链表比较相似。注意:静态区的内存在程序结束后由系统释放。
2023-05-16 20:11:16
1498
原创 右值引用优化性能,避免深拷贝
上面的代码中加入了移动构造(Move Construct)和移动赋值,从移动构造和移动赋值函数的实现中可以看到,它的参数是一个右值引用类型的参数Mystring&&。这里的Mystring&&用来根据参数是左值还是右值来建立分支,如果是临时值(将亡值),则会选择移动构造函数,移动构造函数只是将tmp对象资源做了浅拷贝,不需要对其深拷贝,从而避免了额外的拷贝,提高性能。若使用旧对象去构造新对象,调用拷贝构造函数,若调用的是浅拷贝,则两个对象指向同一块内存空间,若析构会导致堆内存的重复删除,就会出现非法访问。
2023-05-15 16:02:28
170
原创 C11 左值引用与右值引用
通过右值引用的声明,该右值又重获新生,其生命周期与右值引用类型名的生命周期一样。func(b):首先联编func(const int&val),不能与func(int &val)和func(int &&val)联编。常量左值引用是一个万能引用类型,可以接收左值、右值、常量左值和常量右值。通过右值引用,比之前少了一次拷贝构造和一次析构,原因在于右值引用绑定了右值,让临时右值的生命周期延长了。总结:右值引用a是具名右值引用,编译器会将已命名的右值引用视为左值。有左值与右值就有了左值引用与右值引用。
2023-05-14 15:16:35
384
原创 常见面试题:小岛问题
思路:2.广度遍历,建立一个存顶点类型的队列,从二维数组中的一个顶点开始入队,1表示有邻接顶点,0表示没有,将这个顶点进行标记为1表示用过,用front存对头,队列不为空则出队,找这个顶点的左右和上下是否存在邻接顶点,有几个图就有几个小岛。思路:1.深度遍历:从二维数组中一个顶点开始,1表示有邻接顶点,0表示没有,深度遍历上下左右深度去找有几个图就有几个小岛。用二维数组来表示地图,其中0表示水域,1表示土地,垂直方向和水平方向的1相连。组成一个小岛,计算给定的地图中有几个小岛。
2023-05-13 14:19:25
247
原创 图的两种遍历方式:深度遍历DFS和广度遍历BFS
深度遍历(DFS):先写一个bool*visited标记数组每个顶点都初始为false,使用递归深度遍历顶点的第一个顶点,第一个顶点邻接表的第一个顶点,如果这个邻接表的第一个顶点被标记过,找他的下一个顶点。BFS(广度遍历)类似于树的层次遍历,同样借用与队列,把顶点A放入队列,把A出队用front存下A,把A的邻接顶点全部入队并标记。广度遍历:顶点A->A的所有邻接顶点->A的第一个邻接顶点的所有未使用过的邻接顶点。深度遍历:顶点A->A的第一个邻接顶点->......
2023-05-13 13:35:02
276
原创 数据结构:图的插入和删除
有向边:若从顶点vi到vj的边有方向,则称这条边为有向边 ,也称为弧(Arc),用有序偶来表示,vi称为弧尾(Tail),vj称为弧头(Head)。无向边:若顶点vi到vj之间的边没有方向,则称这条边为五向边(Edge),用无序偶对(vi,vj)来表示。线性表中,相邻的数据元素之间具有线性关系,树结构中,相邻两层的结点具有层次关系,而图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以为空。在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。
2023-05-06 21:18:12
1028
原创 排序:归并排序、堆排序、快速排序
归并排序(Merging Sort)就是利用归并思想实现的排序方法。它的原理就是假设初始序列含有n个记录,则可以看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,...如此重复,直至得到一个长度为n的有序序列为止。1.创建堆:(大根堆)从中间结点开始,中间结点一定在倒数第二层,提高效率。2.排序:把第一个结点和最后一个结点交换,结点个数减一。归并算法的非递归实现。
2023-04-23 21:15:13
208
原创 I/O复用函数,poll和epoll的用法与select、poll、epoll的区别
对于ET模式操作的文件描述符,当epoll_wait检测到其上有事件,并将此事件通知应用程序后,应用程序必须立即处理该事件,因为后续的epoll_wait调用将不再向应用程序通知这一事件。对于LT模式操作的文件描述符,当epoll_wait检测到其上有事物发生并将此事通知应用程序后,应用程序可以不立即处理该事物。epoll对文件描述符有两种操作模式:LT模式和ET模式。当epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将以高效的ET模式来操作该文件描述符。入文件描述符或事件集。
2023-04-23 19:51:57
707
原创 C++11 左值、右值、纯右值、将亡值
b)、取地址表达式(&a)等,计算结果相当于字面值,(数据实际存储在CPU的数据寄存器中),所以是将亡值,此将亡值不可写·,由于运行结果是字面量,所以是纯右值。而对于i++来说,是先对i进行一次拷贝(计算过程中所产生的临时量),将得到的副本作为返回结果,然后再对i+1,由于i++的结果是对i+1前的一份拷贝,它不是具名,所以是将亡值,此将亡值不可写,所以也是右值。临时量有可能是字面值,也可能是一个不具名的对象。对i加1后再赋值给i,最后返回的结果就是i,所以,++i的结果具名的,名字就是i,所以是左值。
2023-04-23 17:34:03
694
原创 数据结构:二叉排序树
观察发现:要删除的结点的前驱是第一个左孩子的最右边孩子,后继是第一个右孩子的最左侧孩子,则用任意一个取替换要删除的结点,然后删除替换的那个结点。有序序列,查找可以使用二分查找,查找容易,但是插入、删除不方便。6.最左边的孩子一定是最小的结点,最右边的孩子一定是最大的结点。3.右子树如果不空,右子树上所有的结点的值都大于根结点。二叉排序树使得插入和删除的效率变高,查找也高效进行。2.左子树如果不空,左子树上所有结点的值都小于根结点。5.二叉排序树的中序遍历是有序的。注意:二叉排序树是有可能重复的。
2023-04-22 19:23:27
420
原创 JSON的用法和说明
对象是一个无序的“ ’名称/值‘ 对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。“ ’名称/值‘ 对”之间使用“,”(逗号)分隔。值可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。数组是值(value)的有序集合。一个数组以“[”(左括号)开始,“]”(右括号)结束。字符串(string)是由双引号包围的任意数量字符的集合,使用转义字符'\'。"名称/值"对的集合。)是一种轻量级的数据交换格式。
2023-04-21 19:49:57
752
原创 剑指offer二叉树的最近公共祖先
我们可以用哈希表存储所有节点的父节点,然后我们就可以利用节点的父节点信息从 p 结点开始不断往上跳,并记录已经访问过的节点,再从 q 节点开始不断往上跳,如果碰到已经访问过的节点,那么这个节点就是我们要找的最近公共祖先。输入:root=[3,5,1,6,2,0,8,null,null,7,4] p=5 q=1。输入:root=[3,5,1,6,2,0,8,null,null,7,4] p=5 q=4。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。解法二:哈希表存储父节点。
2023-04-21 15:19:18
102
原创 Linux I/O复用函数的使用情况和select接口的介绍
select系统调用的用途是:再一段指定时间内,监听用户感兴趣的文件描述符的可读、可写和异常事件。需要指出的是, I/O 复用虽然能同时监听多个文件描述符,但它本身是阻塞的。I/O 复用使得程序能同时监听多个文件描述符,这对于提高程序的性能至关重要。多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依处理其中的每一。个文件描述符,这使得服务器看起来好像是串行工作的。将数组中的套接字描述符设置到fd_set变量中,并返回当前最大文件描述符。1.TCP服务器同时要处理监听套接字和连接套接字。
2023-04-21 13:50:53
359
1
原创 C++ 判断是否是合法的出栈顺序
要判断一个栈的出栈顺序是否合法,思路是用一个队列把出栈顺序存起来,再用一个栈,把第一个数放到栈里,用栈顶元素与对头元素进行比较若相等则出栈、出队,若不想等则继续按顺序进行入栈。如果最后队列为空,证明出栈顺序是合法的,否则,不合法。一个栈可以全部入完再出,也可以入一部分再出一部分再入,和入一部分出完再入。
2023-04-20 10:35:12
905
原创 剑指offer 二叉树中和为某一值的路径
本题是找出二叉树中和为某一值的路径,树的路径是指从树根到叶子结点的路径长度之和。我们可以遍历树,把树的每一分支的路径长度与目标长度进行比较,若相等用数组存起来,最后找到所有满足条件的路径,放在二维数组里。输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22。输出:[[5,4,11,2],[5,8,4,5]]路径总和等于给定目标和的路径。是指没有子节点的节点。
2023-04-20 10:13:29
76
原创 HTTP超文本传输协议
浏览器与 web 服务器在应用层通信使用的是 HTTP 协议(超文本传输协议),而 HTTP协议在传输层使用的是 TCP 协议。那么浏览器需要和 web 服务器三次握手建立连接后,才可以发送 HTTP 请求报文,服务器收到请求报文后,向浏览器回复 HTTP 应答报文。这种方法会影响服务器:服务器可能根据收到的数据动态创建新的资源,也可能更新原有的资源。浏览器向服务器发起连接前,需要得到服务器的 IP 及端口。浏览器服务器建立连接后,如果两次以上的请求复用同一个 TCP 连接,则称之为长连。
2023-04-19 14:21:38
443
原创 TCP协议与UDP协议
tcp协议是面向连接的,客户端和服务器是连接的,所以不同的send()发送的数据在同一个发送缓冲区中,即发送方发送的若干包数据到接收方接收时粘成一包,从接受缓冲区来看后一包的数据紧接着前一包数据的尾。TCP字节流的特点,发送端执行的写操作次数和接收端的读操作次数之间没有任何数量关系,应用程序对数据的发送和接收是没有边界限制的。口的大小是由接收端填充的接收通告窗口的大小决定的,并且窗口的位置会随着发送端数剧的发送和接收到接收端对数据的确认而不断的向右滑动,将之称为滑动窗口。
2023-04-17 19:32:51
859
原创 数据结构:赫夫曼树
带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子节点的带权路径长度之和。路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径。树的路径长度:从树根到每一结点的路径长度之和。路径长度:路径上的分支数目称作路径长度。带权路径长度最小的二叉数被称为赫夫曼树。
2023-04-17 17:10:32
99
原创 二叉树的恢复
要恢复二叉数只能用先序遍历和中序遍历、中序遍历和后序遍历的结果进行恢复。二叉数有先序、中序、后序遍历。先序遍历:根、左、右。中序遍历:左、根、右。后序遍历:左、右、根。
2023-04-16 14:38:17
107
原创 二叉数的构造和遍历(递归与非递归)
1.定义:二叉数是(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉数),或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉数组成。就像人双手、双脚,但显然左手左脚和右手右脚是不一样的,右手戴左手套,右脚穿左鞋都会及其别扭。每个结点最多有两颗子树,所以二叉数中不存在度大于2的结点。没有子树或者有一颗树都是可以的。空二叉数、只有一个根结点、根结点只有左子树、根结点只有右子树、根结点既有左子树又有右子树。非递归实现二叉数的先序、中序、后序、层次遍历。
2023-04-13 21:03:23
246
原创 socket网络编程
sendto()用来发送数据,由于udp时无连接的,每次发送数据都需要指定对端的地址(IP和端口)。此时其他客户端向服务器发起连接后,由于服务器阻塞了,无法执行accept()接受连接,也就是其他客户端发生的数据,服务器无法读取,服务器也就无法并发同时处理多个客户端。主线程(父进程)只负责监听客服端的连接,并使用accept()接受连接,不进行数据的处理。监听队列有两种,一个是存放未完成三次握手的连接,一种是存放已完成三次握手的连接。每处理一个连接,则accept()返回该连接对应的套接字描述符。
2023-04-13 20:02:19
946
原创 计算机网络基础
广域网或者说互联网通常使用众多分级的路由器来连接分散的主机或者局域网,因此,通信的两台主机一般不是直接相连的,而是通过多个中间结点(路由器)连接的。TCP/IP协议体系结构中,数据链路层的功能描述为实现网卡接口的网络驱动程序,以处理数据在物理媒介上的传输,不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供了一个统一的接口。因此,这一层的主要功能是在物理层提供的比特流的基础上,通过差错控制,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。
2023-04-07 14:26:51
892
原创 面试题:堆和栈的区别
栈是由系统自动分配,会在硬件层次对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请与管理容易产生内存碎片,故堆的效率比栈低的多。动态分配是由alloca()函数分配,但是栈的动态分配是由系统进行释放,无需我们手工实现。理论上进程可申请的堆大小为虚拟内存大小,进程栈的大小64bits的Windows默认1MB,64bits的Linux默认10MB;
2023-04-06 20:26:05
1588
原创 两个字符串的最长公共单词
用strtok拆分字符串,strcmp比较字符串是否相等,strlen比较相等字符串的大小。第二个参数:字符串的分隔符。
2023-04-06 19:32:00
385
原创 计算机网络基础概论
因此假定连接在局域网上的一台计算机的适配器坏了而我们更换了一个新的适配器,那么这台计算机的局域网的地址也就改变了,虽然这台计算机的地理位置没有发生变化。IP地址有分IPV4和IPV6两种格式,IPV4使类似“A.B.C.D”的格式,它是32位的,用"."分为四个阶段,每个阶段是8个位(值位0-255),用10进制表示。IPV6 地址是 128位,格式类似:"XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX",用":"分成8个段,每个段16个位,用4个16进制表示。
2023-04-05 19:03:03
411
原创 C++STL 标准模板库
算法:用来处理群集内的元素,它们可以出于不同的,䣌而搜索,排序,修改,使用那些元素。是一种应用在容器上以各种方法处理其内存的行为或功能,如sort(排序),copy(拷贝)...,算法由模板函数体现,这些函数不是容器类的成员函数,是独立的函数,它们可以用于STL容器,也可以用于普通的C++函数。:用来管理某类对象的集合,容纳特定数据结构对象的集合,STL容器是将最常用的一些数据结构实现出来,包含了许多数据结构,如:vector,queue,stack...string也可以看作是一个容器。
2023-03-30 20:48:17
460
原创 Linux线程的创建与同步
每个线程都拥有唯一隶属于自己的 task_struct,所以在内核中,它看起来就像是一个普通的进程(只是线程和其他一些进程共享某些资源,如地址空间)。线程同步指的是当一个线程在对某个临界资源进行操作时,其他线程都不可以对这个资源进行操作,直到该线程完成操作,其他线程才能操作,也就是协同步调,让线程按预定的先后次序进行运行。线程是进程内部的一条执行序列或执行路径,一个进程可以包含多个线程。1.进程是资源分配的最小单位,线程是CPU调度的最小单位。2.进程有自己独立的地址空间,线程共享进程中的地址空间。
2023-03-29 14:47:40
389
原创 Linux共享内存
共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间,多个进程可以将其映射到自己的虚拟地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由malloc分配的一样。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何进程看到。由于它并未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问。例题:进程a向共享内存中写入数据,进程b从共享内存中读取数据并显示。
2023-03-22 15:25:16
223
1
原创 C++中的多态与虚函数
对于相关的类型,确定它们之间的一些共同特征,(属性和方法),将共同特征被转移到基类中,然后在基类中,把这些共同的函数或者或方法声明为公有的虚函数接口,然后使用派生类继承基类,并且在派生类中重写这些虚函数,以完成具体的功能,这种设计使得共性很清楚,避免了代码重复,将来容易增强功能,并易于长期维护。关键字virtual指明该成员函数为虚函数,只能将类的成员函数定义为虚函数,当某一个类的成员函数定义为虚函数,则由该类派生出来的所有派生类中,该函数始终保持着虚函数的特性。函数重载,运算符重载,属于编译时的多态性。
2023-03-20 20:48:20
415
原创 Linux信号量
一般情况下,它们都会呗sys/sem.h自动包含,因此不需要为它们明确添加相应的# include语句。例题:进程 a 和进程 b 模拟访问打印机,进程 a 输出第一个字符‘ a’表示开始使用打印。机,输出第二个字符‘ a’表示结束使用, b 进程操作与 a 进程相同。时,需要对信号量的值进行原子减一,该操作被称为 P 操作。释放资源时,需要对信号量的值进行原子加一,该操作被称为 V。信号量的值如果只取 0,1,将其称为二值信号量。临界资源:同一时刻,只允许被一个进程或线程访问的资源。
2023-03-19 14:42:55
505
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人