自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 内核态与用户态的转换

目录概念Linux系统调用系统调用号与系统调用表如何切换概念操作系统 - 管理计算机硬件与软件资源的软件.是用户与系统交互的操作接口.为它上面运行的程序提供服务.操作系统内核 - 操作系统的核心.负责管理系统的进程.内存.设备驱动程序.文件和网络系统.一个内核不是一套完整的操作系统.如Linux.Linux操作系统 - 基于Linux 内核的操作系统.通常由Linux内核.shell(特殊的应用程序.提供运行其他程序的接口).文件系统和应用程序.Linux体系结构Linux 的运行

2021-04-13 19:44:36 3790

原创 Socket(套接字)概述

目录概念Socket基础API概念Socket中文意思是“插座”.在Linux环境下.用于表示进程x间网络通信的特殊文件类型.本质为内核借助缓冲区形成的伪文件.既然是文件.那么理所当然的.我们可以使用文件描述符引用套接字.Linux系统将其封装成文件的目的是为了统一接口.使得读写套接字和读写文件的操作一致.区别是文件主要应用于本地持久化数据的读写.而套接字多应用于网络进程间数据的传递.在TCP/IP协议中.“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程.“IP地址+端口号”就对应一个

2021-04-09 22:18:24 437

原创 分包和粘包问题的解决方法

目录分包粘包解决方法Demo分包场景:发送方发送字符串”helloworld”.接收方却分别接收到了两个数据包:字符串"hello"和"world"发送端发送了数量较多的数据.接收端读取数据时候数据分批到达.造成一次发送多次读取 造成分包的原因:TCP是以段(Segment)为单位发送数据的.建立TCP链接后.有一个最大消息长度(MSS).如果应用层数据包超过MSS.就会把应用层数据包拆分.分成两个段来发送. 这个时候接收端的应用层就要拼接这两个TCP包.才能正确处理数据.相关的,路由器有一个MT

2021-04-06 19:47:13 988

原创 进程间通信---信号量

信号量1.场景程序中.有时存在一种特殊代码.最多只允许一个进程执行该部分代码. 这部分区域.称为"临界区".然而在多进程并发执行时.当一个进程进入临界区.因某种原因被挂起时.其他进程就有可能也进入该区域.解决办法:使用信号量 .2.什么是信号量信号量.是一种特殊的变量.只能对信号量执行P操作和V操作.P操作:如果信号量的值 > 0.则把该信号量减1.如果信号量的值==0.则挂起该进程. V操作:如果有进程因该信号量而被挂起.则恢复该进程运行如果没有进程因该信号量而挂

2021-04-05 22:10:26 252

原创 进程间通信---信号

信号含义:信号是给程序提供一种可以处理异步事件的方法.它利用软件中断来实现.不能自定义信号.所有信号都是系统预定义的.信号如何产生:1)由shell终端根据当前发生的错误(段错误.非法指令等)Ctrl+C而产生相应的信号.比如:socket通信或者管道通信,如果读端都已经关闭.执行写操作(或者发送数据).将导致执行写操作的进程收到SIGPIPE信号(表示管道破裂)该信号的默认行为:终止该进程.2) 在shell终端.使用kill或killall命令产生信号#include <stdio.

2021-04-04 09:15:14 198

原创 HTTP状态码总结

状态码分类常见状态码200 OK:表示从客户端发送给服务器端的请求被正常处理并且返回204 No Content:表示客户端发送给客户端的请求得到了成功的处理.但在返回的响应报文中不含实体的主体部分206 Patial Content:表示客户端进行了范围请求.并且服务器成功执行了这部分GET请求301 Moved Permanently:永久重定向.表示请求的资源被重新分配了URL.之后应使用更改的URL302 Found:临时重定向.表示请求的资源被分配的新的URL.希望本次访问使

2021-03-30 15:56:54 109

转载 手写memcpy.memset

memcpyvoid* m_memcpy(void* dest, const void* src, size_t size){ char* p = (char*)dest; char* q = (char*)src; assert(dest != NULL && src != NULL); assert(p >= q + size || q >= p + size);//防止内存存在重复的区域 while (size-- > 0) { *q++ = *q

2021-03-28 15:26:25 189

原创 手写strcpy.strlen.strcmp.strcat

面试中可能会让自己手写的函数1.strcpychar* m_strcpy(char* dest, const char* src)//将src复制到dest{ if ((dest == NULL) || (src == NULL)) return NULL; char* res = dest; while ((*dest++ = *src++) != '\0'); return res;}2.strlenint m_strlen(const char* dest)//获取des

2021-03-27 13:20:36 249

原创 三种IO多路复用模型的区别

原理:selectselect本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理.这样所带来的缺点是:单个进程可监视的fd数量被限制需要维护一个用来存放大量fd的数据结构.这样会使得用户空间和内核空间在传递该结构时复制开销大对socket进行扫描时是线性扫描pollpol本质上和select没有区别.它将用户传入的数组拷贝到内核空间.然后查询每个fd对应的设备状态.如果设备就绪则在设备等待队列中加入一项并继续遍历.如果遍历完所有fd后没有发现就绪设备.则挂起当前进程.直到设备就绪

2021-03-26 20:40:16 668

原创 IO复用:Poll

Poll和select 一样.如果没有事件发生.则进入休眠状态.如果在规定时间内有事件发生.则返回成功.规定时间过后仍然没有事件发生则返回失败.可见.等待期间将进程休眠.利用事件驱动来唤醒进程.将更能提高CPU的效率.接口int poll(struct pollfd *fds, nfds_t nfds, int timeout);输入参数:fds://可以传递多个结构体,也就是说可以监测多个驱动设备所产生的事件,只要有一个产生了请求事件,就能立即返回struct pollfd {int

2021-03-24 21:36:11 141

原创 使用vs2019开发linux C/C++程序.

因为本人不会写makefile.所以使用vs下的"一键编译"来写程序.一.将自己的Linux系统设置为静态ip1.将自己的Linux系统设置为静态ip.具体操作如下:vim /etc/network/interfaces刚进来的时候应该是这样.将其修改为下图:address 为ip addr所查询到的地址netmask 默认为255.255.255.0geteway 为ip route show获得的地址2.配置DNS服务器地址vim /etc/resolvconf/resolv

2021-03-16 22:12:09 522

原创 面试小题:反转句子.

最近看一些面经的题目.有这样一个题目:反转句子.但要以逗号作为分隔.样例如下:“hello world, god bless you” -> “world hello, you bless god”觉得很有用.自己试着做了下.代码:#include <iostream>#include <string>#include <stack> using namespace std;int main(void){ string str = "hell

2021-03-14 14:58:32 192

原创 IO复用:Select

Select接口1.创建int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);nfds:最大的文件描述符加1.readfds: 用于检查可读的.writefds:用于检查可写性.exceptfds:用于检查异常的数据.timeout:一个指向timeval结构的指针.用于决定select等待I/o的最长时间.如果为空将一直等待.timeval

2021-03-13 21:35:11 107

原创 IO复用:Epoll

Epoll接口1.创建文件句柄int epoll_create(int size);2.向epoll对象修改.添加.删除事件.int epoll_ctl(int epfd,int op,int fd,struct epoll_event*event);events取值:EPOLLIN 表示数据可以读出(接受.关闭连接)EPOLLOUT 表示连接可以写入数据发送(向服务器发起连接.连接成功事件)EPOLLERR 表示对应连接发送错误EPOLLHUP 表示对应的连接被

2021-02-22 18:08:44 126

空空如也

空空如也

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

TA关注的人

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