Linux
文章平均质量分 87
Fireplusplus
前深信服员工,前鹅厂员工
展开
-
TCP shutdown 之后~
通过 shutdown() 关闭读写操作,会发生什么?具体点呢,考虑两个场景:原创 2024-08-18 12:36:14 · 821 阅读 · 0 评论 -
UDP connect 内核源码分析
有多少人看过 udp 的 connect 实现。。原创 2024-07-28 23:36:42 · 840 阅读 · 0 评论 -
Linux动态追踪——eBPF
动态追踪进阶——eBPF原创 2024-04-21 15:07:17 · 1336 阅读 · 0 评论 -
Linux内核常见的丢包场景有哪些
一个数据包在网络中传输的过程中,是没法保证一定能被目的机接收到的。其中有各种各样的丢包原因,今天来学习一下数据包经过 linux 内核时常见的丢包场景。原创 2024-04-14 11:34:09 · 1171 阅读 · 0 评论 -
Linux是怎么发送一个网络包的?
一个网络包的发送,始于应用层,经层层协议栈的封装,终于网卡。今天来循着一个网络包的足迹👣,深入学习一下 Linux 下发送数据的处理流程。原创 2024-03-31 15:02:38 · 1165 阅读 · 0 评论 -
Linux收到一个网络包是怎么处理的?
一个网络包的接收始于网卡,经层层协议栈的解析,终于应用层。今天来循着一个网络包的足迹👣,深入学习一下 Linux 下接收数据的处理流程。原创 2024-03-24 18:57:22 · 1448 阅读 · 2 评论 -
epoll怎么就高效了?
万字长文,从内核源码学习 epoll 的高效之处~原创 2024-03-17 14:15:04 · 1539 阅读 · 0 评论 -
Linux动态追踪——ftrace
动态跟踪工具 ftrace 的使用~原创 2024-03-10 18:19:00 · 1909 阅读 · 0 评论 -
Linux的进程调度实现
经常被问到进程的调度算法有哪些,什么先进先出、短进程优先、时间片轮转、多级反馈多列等等算法能说一大堆?那具体的,linux内核使用了什么样的算法,且来探究一下。原创 2024-03-09 20:40:20 · 1298 阅读 · 0 评论 -
零拷贝技术-内核源码剖析
小师妹说零拷贝就是快~原创 2023-03-05 11:37:38 · 454 阅读 · 0 评论 -
TCP伪装
给UDP穿个外套吧原创 2022-12-04 12:23:35 · 1715 阅读 · 0 评论 -
从malloc到内存管理
malloc是谁?malloc是怎么分配内存的?malloc分配的是什么内存?原创 2021-07-25 23:03:03 · 422 阅读 · 0 评论 -
数据安全与虚拟网卡的应用(三)
墨迹了大半年,终于把这个玩意墨迹的差不多了。整体的结构跟当初设计的还是有一些偏差的,一部分原因是因为懒,另一部分原因是没人关注没动力,随便搞搞吧。原创 2021-06-19 13:08:39 · 297 阅读 · 0 评论 -
数据安全与虚拟网卡的应用(二)
上次写到我们打开了一个虚拟网卡,得到的其实是一个文件描述符。考虑到我们后面还会有其它的文件描述符需要统一管理,为了方便,我们得提前实现好管理描述符的逻辑。Let‘s do it !原创 2021-04-24 17:49:56 · 258 阅读 · 0 评论 -
数据安全与虚拟网卡的应用
最近逛github偶然发现了自己之前写的一段创建tun网卡的c代码,才发现它孤零零的在那儿躺了很久,想着怎么不让它继续孤单下去,于是就有了现在这篇文章:30天用c实现一个代理,也算物尽其用了吧。原创 2021-01-31 23:24:30 · 421 阅读 · 0 评论 -
linux下的动态库注入
前言最近在维护公司的一个服务X,服务X因为协议设计的不够安全,存在被攻击的风险,所以修改协议提升安全性就显得势在必行了。然鹅,该项目涉及到多个版本,将改动合入到各个版本引起的开发及测试工作量颇大,最终讨论后决定通过动态库注入的方式进行修改。何为动态库注入动态库注入是指在程序启动或运行的时候,通过某种手段加载另一套接口库,替换原有依赖库中的函数。这样可以达到改变程序功能而又不对原有代码进行修改的目的。如何做linux下有一个环境变量叫LD_PRELOAD,动态链接器在载入一个程序所需的所有原创 2020-10-14 23:13:56 · 1905 阅读 · 2 评论 -
IPC的选择
常见的进程间通信方式大概有如下几种:管道、消息队列、共享内存、套接字。以前只是大概了解了这几种实现方式,但对于如何选择一种合适的通信方式一直没有清晰的认识,这几天抽空查阅了资料,顺便整理下。管道管道分命名管道与匿名管道,用作两个进程间通信,数据只能以字节流的方式单向传输,如果要双向通信,就得开两个管道。有关管道的详细介绍可以参考:https://blog.csdn.net/qq_33724710/article/details/52345509管道的可读性并不高(比如匿名管道一端关闭读,一端原创 2020-08-12 00:14:04 · 275 阅读 · 1 评论 -
Linux内存管理——内核内存管理
前言 linux内存管理可以分为两部分,内核内存管理,进程内存管理。由于一些条件的限制,比如内核分配内存时不能睡眠,不能像用户空间那样奢侈的使用内存,内核的内存分配与用户空间的内存分配是不太一样的,本文据此大概讨论下内存管理机制。页内核把页作为内存管理的基本单元,尽管cpu的最小可寻址单位为字节。内存管理单元(MMU)用页表对页进行管理,并且负责将物理内存映射为虚拟内存。一般体系结构不同,对应的页的大小也是不一样的,比如32为x86的环境,页的大小通常为4KB,64位体系结构一般支持8...原创 2020-06-27 11:40:27 · 404 阅读 · 0 评论 -
centos下创建虚拟网卡
虚拟网卡Tun/Tap较高版本的linux大都自带了tun/tap 驱动程序用以实现虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。Tun/Tap驱动程序工作原理做为虚拟网卡驱...原创 2020-01-01 13:08:48 · 2865 阅读 · 1 评论 -
多线程还是多进程的选择及区别
鱼还是熊掌:浅谈多进程多线程的选择关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害。 经常在网络上看到有的XDJM问“多进程好还是多线程好?”、“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有转载 2016-09-12 09:10:37 · 7487 阅读 · 0 评论 -
【Linux】阻塞信号
LInux中信号产生的原因大致有一下三种:键盘中断命令发出异常产生中断但归根结底,这些信号其实都是最终有操作系统发出的。常见的对信号的处理,无外乎以下三种:忽略终止该进程自定义行为对信号的处理动作叫做信号递达,在信号由产生到递达的过程中还有一种状态叫做未决。即信号虽产生,但是未被处理。这个时候就需要将信号保存起来。信号的种类: 其中,前31原创 2016-07-09 22:29:26 · 655 阅读 · 0 评论 -
IO多路转接之epoll
#include #include #include #include #include #include #include #include #include int start_up(char* ip, short port){ int listen_sock = socket(AF_INET, SOCK_STREAM, 0); if (listen_sock < 0原创 2016-09-27 13:40:48 · 519 阅读 · 0 评论 -
漫谈-线程
线程概念我们都知道,进程拥有独立的地址空间,进程之间共享数据需要通过进程间通信机制来实现。然而进程是单一执行流的,有些时候需要在同一个进程中执行多个控制流程,这时候线程就派上了用场。比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实原创 2016-09-10 13:04:24 · 433 阅读 · 1 评论 -
进程内存印象
Linux下C程序生成主要由四个步骤组成:预编译、编译、汇编、链接。编译器gcc经过 预编译、编译、汇编3个步骤将源程序文件转换成目标文件。如果程序有多个目标文件或程序中使用了库函数,则编译器还需要将所有目标文件及所需的库文件链接起来,最后生成可执行程序。当程序执行时,操作系统将可执行程序复制到内存中,程序转为进程通常需要以下步骤: *内核将程序读入内存,为程序分配内存空间;原创 2016-08-25 19:59:34 · 628 阅读 · 0 评论 -
vfork死循环问题
关于vfork函数的一个问题。#include #include #include #include int main(){ int g_val = 100; pid_t id = vfork(); if (id == 0) { g_val++; printf("child runing first...%d:%p\n", g_val, &g_val); sle原创 2016-08-27 14:58:45 · 1012 阅读 · 0 评论 -
I/O多路转接之select
什么是select?首先它是系统调用,系统提供它用来实现多路复用输入/输出模型。利用它可以让我们的程序来监视多个文件句柄。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。 参数nfds代表要监听的文件描述符的最大值加1。接下来三个参数分别表示要监听事件对应的文件描述符集:可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集原创 2016-08-01 21:38:21 · 382 阅读 · 0 评论 -
可重入函数和线程安全的区别与联系
什么是线程安全:一个函数被称为线程安全的(thread-safe),当且仅当被多个并发进程反复调用时,它会一直产生正确的结果。反之,如果一个函数不是线程安全的,我们就说它是线程不安全的(thread-unsafe)。所以,有这么四类函数称为线程不安全的:不保护共享变量的函数;函数状态随着调用改变的函数;返回指向静态变量指针的函数;调用线程不安全函数的函数什么是可重入函数:可重入函数原创 2016-07-20 14:41:37 · 523 阅读 · 0 评论 -
死锁
所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须原创 2016-07-19 23:19:39 · 360 阅读 · 0 评论 -
最简单的server/client程序
编写了一个最简单的server/client聊天工具练练手:server.c 的作用用是接受client的请求,并与client进行行简单的数据通信,整体为一一个阻塞式的网网络聊天工工具。server.c:#include #include #include #include #include #include #include #include const shor原创 2016-07-24 22:51:43 · 2718 阅读 · 0 评论 -
gdb在汇编指令级调试程序
方法很多,掌握一种就好:(前提:编译时加 -g 选项)在gdb调试界面输入命令:display /ni $pc 在每行源程序后面显示n行汇编指令(n换成想要的显示的行数,如display /3i $pc)调试方法:之前程序级中调试的下一步 n 对应 现在的 ni,之前的 s 对应现在的 si,其余指令不变。原理:display每执行一条语句打印对应寄存器或变量的值;/ni 将机原创 2016-06-11 09:38:33 · 1275 阅读 · 0 评论 -
Linux时间参数与find命令
Linux时间参数:LInux下的每个档案都会记录着许多的时间参数,其中有三个主要的变动时间,分别是mtime,ctime,atime。那么这三个时间参数又代表着什么样的意义呢?怎么可以看得到它们?下面就来介绍一下。首先我们可以用一条命令来得到一个文件的某些参数:我们对当前文件夹下的一个clean文件执行了stat命令,用来查看这个文件的一些信息。可以看到下面列出来的Acc原创 2016-05-18 23:27:03 · 14421 阅读 · 2 评论 -
宏与内联
在C++里边推荐用内联函数来代替宏,这里面当然有它这样做的`理由。下面就来总结一下宏与内联各自的优缺点。刚学C时,你写的第一个宏可能是这样的:#define MAX(a, b) ((a)>(b) ? (a) : (b))如果要调用这个宏函数,我们会这样:MAX(a, b); 我们都知道,编译器对宏只是做简的替换,所以编译预处理阶段结束后这条语句就会被替换为 a > b ? a原创 2016-06-01 15:22:58 · 447 阅读 · 0 评论 -
vim——打开多个文件、同时显示多个文件、在文件之间切换
打开多个文件:1.vim还没有启动的时候:在终端里输入 vim file1 file2 ... filen便可以打开所有想要打开的文件2.vim已经启动输入:open file可以再打开一个文件,并且此时vim里会显示出file文件的内容。同时显示多个文件::split:vsplit在文件之间切换:1.文件间切换Ctrl+6—下一个文件转载 2016-04-29 22:30:30 · 946 阅读 · 0 评论 -
进程等待
为什么需要进程等待?一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或者waitpid获取这些信息,然后彻底清除掉这个进程,当它终止是Shell调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。当原创 2016-08-28 13:15:12 · 1034 阅读 · 0 评论 -
进程程序替换
进程程序替换用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换(也仅仅替换代码和数据,其它不变),从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。其实有六种以exec开头的函数,统称exe原创 2016-08-28 13:39:31 · 623 阅读 · 0 评论 -
聊天室
实现一个基于udp协议的网络群聊系统,可以完成多人的实时信息交互任务。其实就是类似于实现qq的群聊。系统环境Ubuntu 编辑器:vim 编译器:g++ 调试器:gdb 辅助编译工具:Makefile原理图首先说的是client:client要完成的功能当然首先就是数据的接收和发送了(都从server接收和发送给server),其次,作为一个client,没有一个窗口界原创 2016-09-05 12:43:08 · 620 阅读 · 0 评论 -
Linux信号通识
何为信号信号是操作系统提供的一种向进程通知发生了某种特定事件的机制。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。直接看概念可能还是很模糊,所以从最简单的例子开始:用户输入命令,在Shell下启动一个前台进程用户按下Ctrl-C,这个键盘输入产生一个硬件中断如果CPU当前正在执行这个原创 2016-09-03 13:57:19 · 669 阅读 · 0 评论 -
进程间通信之共享内存
何为共享内存共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共原创 2016-09-02 14:47:30 · 2041 阅读 · 0 评论 -
进程间通信之信号量
何为信号量信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。对信号量的操作当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用:大于0,资源可以请求,将信号量的值-1(P操作);等于0,无资源可用,进程会进原创 2016-09-02 13:58:17 · 4986 阅读 · 0 评论 -
Linux下的定时计划任务——crontab
cron是一个Linux下的守护进程,用来定期的执行一些任务。要让cron执行你指定的任务,首先就要编辑crontab文件。命令:crontab -e刚进去提示选取一个编辑器,随意选,我习惯里用vim在这里面就可以编写要周期性执行的任务了。格式是这样的: 每项工作就占一行,总共六个字段。此外,还有一些辅助字符: 简单做个测试:原创 2016-09-09 17:16:00 · 423 阅读 · 0 评论