- 博客(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关注的人