linux
文章平均质量分 63
linux基础知识学习
慕白昂
这个作者很懒,什么都没留下…
展开
-
linux gdb 基本调试命令介绍
启动gdb调试方法: gdb 可执行文件名list:简写l ,查看源代码,默认一次10行run:简写r,开始运行程序,直到遇见断点break 行号:简写b,设置断点在某行continue:简写c,从当前断点继续向后执行quit:简写q,退出gdb调试next:简写n,按行调试,不进入函数体step:简写s,单步调试,碰到函数进入函数体until:跳出当前循环体代码,until + 行号,执行到当前行finish:跳出当前执行的函数体,并打印堆栈和返回值等信息到界面。原创 2022-09-15 03:32:42 · 1277 阅读 · 1 评论 -
tinyhttpd 超轻量型HTTP服务器源码详细解析
tinyhttpd 超轻量型HTTP服务器源码详细解析源码解析入口函数里定义了几个变量,分别是:服务器套接字、客户端套接字,端口号、用于处理TCP网络通信地址的结构体sockaddr_in、其长度client_name_len、线程标识符调用startup函数,其步骤是创建http套接字,绑定地址信息,建立监听连接,最后返回监听套接字循环等待浏览器的连接,当每次获取到新连接时,为该请求创建一个新套接字,并启动线程处理新连接接受到浏览器连接请求后,按行获取http请求报文,具体方法是先按单个字符原创 2021-03-09 13:45:23 · 242 阅读 · 0 评论 -
linux编程:多路转接IO之epoll模型
linux编程:多路转接IO之epoll模型epoll模型:linux下最好用的多路转接模型epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Leve原创 2021-02-18 14:07:03 · 184 阅读 · 0 评论 -
linux编程:多路转接IO之poll模型
linux编程:多路转接IO之poll模型poll模型针对每个描述符构建一个事件结构,描述要监控的是哪个描述符,监控的是什么IO状态,然后在内核中进行遍历判断接口和参数int poll(struct pollfd *fds, nfds_t nfds, int timeout);fds:描述符的事件结构数组首地址,struct pollfd( int fd–监控的描述符;short events–要监控的事件;short revents–实际就绪事件;}nfds: fds参数中监控的有效事原创 2021-02-17 17:21:47 · 143 阅读 · 0 评论 -
linux编程:多路转接复用IO之select模型
linux编程:多路转接复用IO之select模型多路转接IO概念描述的是转接IO,就是对大量的描述符的IO状态进行监控,能够让程序知道哪个描述符IO是就绪的,可以进行IO操作,直接让程序针对就绪描述符进行IO操作,提高效率(更多用于网络通信服务器)。IO就绪状态可读状态:套接字接收缓冲区中,数据大小大于低水位标记(默认-1字节)可写状态:套接字发送缓冲区中,剩余空间大小大于低水位标记(默认-1字节)异常状态select模型实现思路就是在内核中轮询遍历所有监控的描述符,判断IO原创 2021-02-16 18:37:47 · 273 阅读 · 0 评论 -
网络中的IP地址管理策略及其划分
网络中的IP地址管理策略及其划分1. 为什么进行地址管理现在通用的IPv4版本的网络协议的IP地址只有无符号4个字节:其IP地址总量不超过43亿,但是依然不够用。2. 解决方案DHCP 动态地址分配:只给上网的主机分配地址NAT 地址转换技术:组建私网,私网中的大量主机使用同一个IP地址进行上网3. IP地址的分网络管理lP地址组成分为两部分:网络号+主机号网络号:互联网通过大量的网络组成,网络号用于标识一个网络,网络号俗称网段(每个IP地址都会包含有自己所在网络的网络号) —原创 2021-02-13 17:39:02 · 2217 阅读 · 0 评论 -
IP协议解析及MTU最大传输单元的应用
IP协议解析及MTU最大传输单元的应用1. IP协议解析IP协议是属于网络层协议,IP协议只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。2. 具体字段的意义及其功能4位协议版本:当前版本默认为4,表示lPv44位头部长度:以4字节为单位,IP报头固定最小20字节,最大60字节8位服务类型:3位弃用,1位固定0,4位tos字段:最高可靠性,最小成本,最大吞吐量,最小延时16位报文长度:IP报文必须小于64k(tcp报文中数据必须小于64k-40,udp中数据最大小于64k-原创 2021-02-13 15:00:09 · 994 阅读 · 0 评论 -
详述TCP协议中的格式及其传输机制
详述TCP协议中的格式及其传输机制一、TCP协议解析:1. 整体协议格式16位源端端口,16位对端端口,32位序列号,32位确认序列号,4位头部长度,6位保留位,6位标志位,16位窗口大小,16位校验和,16位紧急指针,0~40字节的选项数据和数据。2. 各个位置上的功能描述:16位源端口、16位对端端口:描述通信两端进程;32位序列号、32位确认序列号:完成包序管理,以及确认应答的功能;(序列号决定了当前数据在原始数据中的位置,确认序列号是告诉发送方确认序号之前的数据都已经收到了);4原创 2021-02-09 16:39:58 · 1208 阅读 · 0 评论 -
图解TCP:三次握手和四次挥手及面试问题整理
图解:服务端和客户端之间的三次握手和四次挥手1. 通信流程图2. 三次握手第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入[^1]SYN_SEND状态,等待服务器确认。SYN:同步序列编号(Synchronize Sequence Numbers)...原创 2021-02-08 19:03:17 · 793 阅读 · 0 评论 -
HTTP编程:极简版HTTP服务器搭建
HTTP编程:极简版HTTP服务器搭建极简版http服务器的搭建:http协议是一种应用层的数据格式约定,在传输层使用tcp协议实现两端传输http服务器本质就是一个tcp服务器,只是在应用层的业务处理中根据http协议格式解析请求和响应然后做出对应业务请求处理http_server.c#include<stdio.h>#include<unistd.h>#include<string.h>#include<netinet/in.h>/原创 2021-02-07 17:42:44 · 673 阅读 · 0 评论 -
套接字编程:基于TCP协议的通信编程(优化)
套接字编程:基于TCP协议的通信编程(优化)问题解决解决了上篇代码中每个客户机只能和服务器通信一次的问题解决措施通过fork()创建子进程来解决这个问题,每当服务器与一个客户端新建一个连接后,这时就为其创建一个子进程。然后让子进程再来处理用新套接字newfd进行数据收发的工作,然后在处理完这个客户端与服务器的通信任务后,再自动退出。而父进程则只负责用最开始生成的套接字sockfd来监听,并为新的连接生成套接字newfd。最后每当有一个子进程退出的时候用通过回调函数signal(SIGC原创 2021-02-06 14:17:02 · 135 阅读 · 0 评论 -
套接字编程:基于TCP协议的通信编程
套接字编程:基于TCP协议的通信编程TCP协议传输控制协议(TCP协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。服务端server的工作创建套接字:在内核中创建socket结构体套接字绑定地址:告诉操作系统发往哪个端口和地址的数据应该交给当前套接字进行处理,以及发送数据的时候指定源端地址信息。开始监听:开始受理客户端的连接请求获取新建连接:获取客户端连接请求后,产生一个新的套接字,用于与该客户端通信。收发数据:使用这个获取的新建连接,与指定的客户端进行数据通信发送数原创 2021-02-05 21:31:01 · 479 阅读 · 0 评论 -
套接字编程:基于UDP协议的通信编程
套接字编程:基于UDP协议的通信编程服务端server的任务创建套接字在内核中创建一个socket结构体,使进程与通信网卡之间建立联系。为套接字绑定地址在创建的socket结构体中描述端口,IP,协议信息 为了告诉操作系统,当前这个套接字使用了哪个端口,若是收到了发往这个端口的数据则交给这个套接字进行处理 ,注意只能绑定本机上已有的IP地址。接收数据通过创建套接字的句柄,找到内核中socket结构体,然后从结构体的接收缓冲区中,取出一条数据 ,因为udp无连接,因此接收数据的同时,也会接收原创 2021-02-05 16:37:50 · 428 阅读 · 2 评论 -
linux编程:模拟实现一个线程池
linux编程:模拟实现一个线程池实现一个线程池需要构建三个类:1. 线程任务类给定两个接口,SetTask()负责把给的数据和方法传进任务系统,Start()负责将给定数据用给定方法来处理。2. 安全队列类,负责给线程池提供一个能够互斥访问的安全队列。3. 线程池类提供三个接口,ThreadPool()创建指定数量的线程,TaskPush()将任务放入安全队列,*thread_entry()负责让线程取任务并进行处理。#include<cstdio>#include<qu原创 2021-02-04 23:27:38 · 112 阅读 · 0 评论 -
linux编程:通过信号量实现生产者与消费者模型
linux编程:通过信号量实现生产者与消费者模型信号量: 用于实现同步与互斥。本质: 就是一个计数器,对资源进行计数以及提供一个pcb等待队列,向外提供P/V操作接口,实现同步与互斥P操作: 在临界资源访问之前进行P操作,计数-1,对计数进行判断,小于0则不符合访问条件,使线程阻塞或报错返回,否则正确返回获取资源V操作: 在生产资源之后,进行V操作,计数+1,唤醒一个等待的线程或进程互斥的实现:计数为1,表示资源只有一个,在资源访问之前P操作–加锁,其他线程则无法访问(这时候表示已经没有资源原创 2021-02-04 16:24:50 · 893 阅读 · 0 评论 -
linux编程:多线程之生产者与消费者模型
linux编程:多线程之简单银行家算法该银行家算法中的生产者主要负责向队列中存放数据,并且唤醒消费者来取,消费者主要负责取队列中存放的数据,并且在队列不满时唤醒生产者来存数据。示例中创建了4个生产者线程,4个消费者线程。#include <iostream>#include <queue>#include <pthread.h>#include <cstdio>#define MQX_QUEUE 5class BlockQueue{原创 2021-02-03 20:38:17 · 325 阅读 · 0 评论 -
linux:模拟僵尸进程和孤儿进程
linux:模拟僵尸进程和孤儿进程1.僵尸进程僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态#include <stdio.h>#include <unistd.h>#include<stdlib.h>int main()原创 2021-02-03 15:20:47 · 401 阅读 · 0 评论 -
linux:调用fork()创建子进程
linux:通过fork()创建子进程系统调用fork()后,俩个进程将执行相同的程序段,但是拥有各自不同的堆段,栈段,数据段,每个子程序都可修改各自的数据段,堆段,和栈段1.通过调用fork()后,产生了两个不同的pid值#include <stdio.h>#include <unistd.h>int count1=0;int main(void){ int pid; int count2=0; count1++; count2+原创 2021-02-03 14:40:26 · 2277 阅读 · 0 评论