C
文章平均质量分 65
sesiria
这个作者很懒,什么都没留下…
展开
-
Linux/Unix系统下的线程安全IO
SIO Packages (Signal-Safe IO)/************************************************************* * The Sio (Signal-safe I/O) package - simple reentrant output * functions that are safe for signal handlers. *************************************************原创 2021-10-05 13:56:00 · 422 阅读 · 0 评论 -
Linux/Unix 使用inotify,hook函数来监控文件事件
在实际开发中有时候回遇到许多文件的操作,或者需要对文件事件进行排查。。可以使用inotify函数来完成这项工作代码如下:#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/inotify.h>#define EVENT_SIZE原创 2021-08-15 22:25:25 · 882 阅读 · 0 评论 -
关于信号类程序的同步机制
一、多进程中的信号同步机制:基于signal interrupt的例子,用于防止race condition先看以下例子:#include "csapp.h"void handler(int sig){ int olderrno = errno; sigset_t mask_all, prev_all; pid_t pid; Sigfillset(&mask_all); while((pid = waitpid(-1, NULL, 0原创 2021-07-11 12:51:44 · 454 阅读 · 0 评论 -
CSAPP - 一个简单的Shell
Shell命令在是最常用的一个和操作系统交互的工具。shell命令的基本执行过程是:1)从stdin来读取用户的command。2)对command进行解析,并判断是否为buildin command3)如果是buildin command则执行buildin command4)如果非buildin command,则执行fork命令,然后在fork的子进程中执行execve创建新的program。其中还涉及到对输入command进行parse的简单过程。5)如果要对进程的切换f原创 2021-07-04 22:10:25 · 372 阅读 · 0 评论 -
数据流压缩之应用篇zlib库
关于数据流压缩的原理,lz77以及huffman编码可以参考上一篇:https://blog.csdn.net/sesiria/article/details/116835301本篇将包含以下内容:1. gzip格式分析2. zlib库函数API分析3. zlib库实战(压缩和解压文件)gzip格式采用deflate算法来实现数据的压缩一、deflate采用了改进版的lz77算法即:三个字节以上重复才进行编码,否则不进行编码;即对滑动窗口进行查询的时候最短的匹配大..原创 2021-05-23 17:58:29 · 2514 阅读 · 2 评论 -
数据流压缩原理实现(huffman编码,LZ77压缩算法)
1. 压缩原理deflate算法 a) LZ77 算法原理 b) Huffman算法原理 c) Huffman算法测试实例2. gzip格式分析3. zlib库函数API分析4. zlib库实战(压缩和解压文件)一、数据压缩的原理规则压缩:已知数据的排列组合模式,通过抽象用数学公式来表示。比如矢量图,3D模型的顶点数据等。对于未知规则的数据:则是采用一种更高效的编码来代替原有数据的编码。一种方法是找出数据中那些重复出现的字符串,然后用更短的符号代替...原创 2021-05-23 09:07:14 · 6311 阅读 · 2 评论 -
一个异步日志IO的demo
整理了以下项目中用到的一个异步日志IO的实现,基于以下设计:1. 使用了一个push队列和一个write队列。主线程往push队列中加数据,写线程从write队列中拿数据写到磁盘2. 默认情况下write线程处于睡眠3. 有两种情况会唤醒写线程。 1)push队列满后,会调用force_write将push队列和write队列交换并唤醒写线程将日志写入磁盘 2)如果push队列长时间未满,待定时器触发后,也会切换push和write并唤醒写线程。 3)每次写...原创 2021-05-17 23:18:47 · 182 阅读 · 0 评论 -
Unix/Linux 编程:网络编程之 内存池
一,内存池的原理二,内存池的应用三,基于连接的简单的内存池的实现/** * File name: memorypool.c * Author: sesiria 2021-05-05 * A Implementation of memory pool. * */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#in..原创 2021-05-07 20:53:46 · 221 阅读 · 0 评论 -
Unix/Linux 编程:网络编程之 线程池
一,线程池的基本组成1. 工作线程队列2. 任务队列3. 线程管理器(封装了线程池的一些基本方法,创建,销毁,加入新任务等)比如一个常用的网络服务,通常主循环用于处理接收与基本的recv/send操作。可是如果某些业务操作需要长时间的处理数据。比如等待数据库查询结果,对数据进行编解码等业务逻辑事。为了不让主线程进行长时间的阻塞,从而引入了线程池。让线程池的工作队列来处理具体的业务。主线程则继续处理网络连接。应用:线程池是生产者与消费者模型的一个最典型的应用。最常见的ngin.原创 2021-05-05 18:06:20 · 424 阅读 · 5 评论 -
Unix/Linux 编程:网络编程之 基于Reactor实现WebSocket服务
使用到的上一篇文章中基于epoll实现的Reactor模型。OpenSSL使用其中的SHA1,base64 encode等库openSSL源码使用1.1.0l$ tar xzvf OpenSSL-1.1.0l.tar.gz$ cd OpenSSL-1.1.0l$ ./config –-prefix=/usr/local/openssl$ make$ sudo make install安装完以后需要将openSSL的库和头文件添加到默认的搜索路径。否则后续编译需要加一大串 -I.原创 2021-05-03 18:21:30 · 295 阅读 · 0 评论 -
Unix/Linux 编程:网络编程之 epoll与Reactor
在上一篇文章中实现了epoll的非阻塞IO的服务端程序可是如果实际应用中需要注册大量事件,一个超长的if代码块会严重降低代码的可读性和管理因此参考了 Reactor模型的实现改写了epoll服务器。讲所有的事件处理函数都写成回调函数的形式。这里注意几个参数传递时候的坑。/* Server based on EPOLL */#include <stdio.h>#include <stdlib.h>#include <string.h>#include原创 2021-05-03 13:31:17 · 297 阅读 · 0 评论 -
Unix/Linux 编程:网络编程之 IO模型
一、阻塞IO(blocking)主线程阻塞等待用户连接请求(accept阻塞)。等请求达到以后再调用(recv)系统调用接收数据,这时候又阻塞等待。等内核将数据接受好并从内核空间拷贝到用户空间后,系统调用返回,表明数据读取完毕。这个操作在等待IO的时候会将主线程挂起而不能执行其他操作,浪费了大量服务器性能。二、多线程(blocking+multithread)由于accept系统调用会对每个客户端的连接都返回一个fd,因此可以利用多线程的方法。主线程只负责accept处理连接请求。原创 2021-05-02 14:33:14 · 222 阅读 · 2 评论 -
GDB的基本使用
一、GDB的基本使用1. 编译代码 准备一个文件比如 test_gdb.c#include <stdio.h>int main() { int arr[4] = {1, 2, 3, 4}; int i = 0; for(i = 0; i < 4; i++) { printf("%d\n", arr[i]); } return 0;}编译: -g选项gcc原创 2021-04-24 23:21:10 · 300 阅读 · 0 评论 -
哈希表与布隆过滤器
一,背景问题1.在使用Word文档的时候,word是如何判断某个单词是否拼写正确的?2.网络爬虫程序,怎么让它不去爬相同的URL页面?通过哈希表来查询(时间复杂度O(1))3. 缓存穿透问题如何解决?*描述缓存场景,为了减轻落盘数据库(mysql)的访问压力,在server端与mysql之间加入一层缓冲数据层(用来存放热点数据);*缓存穿透发生的场景是server端向数据库请求数据时,缓存数据库(redis)和落盘数据库(mysql)都不包含该数据,数据请求压力全部涌向落盘数据库原创 2021-04-19 22:37:54 · 784 阅读 · 0 评论 -
链表,堆栈与队列
一,链表定义:struct link_node { int value; struct link_node * next;};1. 判断链表是否有没有环使用两个快慢指针慢指针往后面以动一个节点快指针每次移动两个节点// check whether the link list is a ring// 1 for true, and 0 for false.int isRing(struct link_node* head) { if (head ==原创 2021-04-11 17:43:25 · 408 阅读 · 0 评论 -
排序与查找算法
一,排序其中最基本的三种排序是冒泡,选择与插入。其平均复杂度为O(n^2). 但是其中选择排序在数据有序的情况or数据量小的情况下效率很高。虽然简单也是应该掌握的排序。比如C++的STL库中的sort模板函数,在数据量较小的情况下使用的是插入排序,在数据量较大使用快速排序等。1)冒泡最简单的排序方法。思路如下 时间复杂度O(N^2) 空间复杂度O(1)1)从左往右扫描两两比较数据,如果发现左边的数大于右边的数则交换。第一轮扫描以后,最右边的数一定为序列中最大的数2)第二轮开始扫描原创 2021-04-11 12:20:35 · 680 阅读 · 0 评论 -
C语言中Try/Catch的实现
C语言中Try/Catch的实现许多高级语言中都有Try/Catch的实现用于处理异常。例如在C++中try { // ... do something // ... throw a exception} catch (exception &e) { // handled the specific exception} catch (...) { // handled other exception.}可以通过以上语句块来实现异常的捕获和处理。原创 2021-04-07 22:46:10 · 14553 阅读 · 3 评论 -
atof函数在不包含头文件stdlib.h的情况下也能编译运行,但是转换结果是错误的,为什么
c - Not including stdlib.h does not produce any compiler error!For historical reasons -- specifically, compatibility with very old C programs (pre-C89) -- using a function without having declare原创 2016-08-06 00:14:40 · 3040 阅读 · 0 评论 -
在linux下调用syscalls.h头文件
终于开始看 The C 的第八章 The UNIX System Interface 了!这是比较激动人心的一章,学过之后就可以开始写 Unix 程序了,比如打印目录,查看文件大小、文件属性等,也就是说可以写一些比较实用的小程序了。而且一些系统函数,例如 read(),write()等,是 unix 编程的基础。另外,也讲解了 malloc 的一种实现方法,我想这将会加深我对内存的理解。然转载 2016-08-27 21:22:09 · 6645 阅读 · 0 评论 -
《C 程序设计语言》 第八章 malloc 函数实现于内测管理
这章举例实现了一个内存管理函数malloc 将系统以来的部分和非系统依赖的部分进行分离malloc内部管理的内存区块实际上是一个环链表,用一个全局指针纪录上一次操作的节点,用户遍历时判断是否已经遍历一周。每个链表节点又一个头部组成,纪录了下一个区块的地址和整个区块的尺寸定义如下typedef long Align;union header{ struct {原创 2016-09-10 10:36:04 · 637 阅读 · 0 评论 -
《C 程序设计语言》 第八章 fsize 读取文件夹内容例子的讨论
阅读“C程序设计语言”第八章有一个例子,在UNIX系统是自己实现文件夹的读取等各种操作。其中有一个函数readdir 中 利用了open 和read函数来自己读取文件夹,可是我在Centos7 上总是到失败。查看stackoverflow上有类似的讨论http://stackoverflow.com/questions/21405048/linux-open-directory-as-原创 2016-08-30 23:05:49 · 826 阅读 · 0 评论 -
c语言中的setjmp和longjmp简介
setjmp将当前程序的运行环境存储在一个jump_buf类型的全局变量中(因为后续要被longjmp调用)第一次调用setjmp的返回值是null中后续的代码中执行到longjmp以后,longjmp需要两个参数,一个是之前setjmp保存到运行环境的全局变量可以调整到setjmp函数另一个参数是setjmp函数的返回值,然后程序执行会跳转到setjmp函数并返回longjm原创 2016-09-04 18:07:01 · 712 阅读 · 0 评论 -
C/C++浮点数的存储方式 IEEE-754标准,以及实现一个ftoa函数将浮点数转换为字符串
浮点数的存储格式转载自 :http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中...原创 2019-10-14 11:44:44 · 3978 阅读 · 0 评论 -
一个C/C++ 命令行参数处理的程序
最近在学习K&R C中讲解的关于UNIX系统下运行命令的参数的讲解,其中可选参数 -x -n 可以被-xn取代。这种处理方法的代码非常精练,这里记录下来以后用得上代码如下 这是一个查找输入的行中是否含有匹配字符串的命令 并且有 -x -n两个可选参数。vs2015和gcc下编译通过#define _CRT_SECURE_NO_WARNINGS#include #原创 2016-08-14 15:01:22 · 2645 阅读 · 0 评论 -
String/WString, char* /wchar_t* 相关操作函数
转载自:http://blog.csdn.net/fghygzs/article/details/17289675目录(?)[-]内存操作目录文件string和wstring容器[cpp] view plain copyallocate //分配器 iterator转载 2017-10-12 11:00:28 · 793 阅读 · 0 评论 -
Windows/Mac平台下Visual Studio Code C++开发环境搭建
Windows/Mac平台下Visual Studio Code C++开发环境搭建第一部分:Windows平台(Mingw32+Visual Studio Code)发现使用Mingw32有一个缺陷,很多c++11的功能都无法编译。更不要说后续的C++14和C++17了。难道Windows下只能用微软自家的编译器?参考了知乎上这篇文章https://www.zhihu.com/question/...原创 2018-01-01 13:59:02 · 22599 阅读 · 0 评论 -
GCC 默认不链接math库
在linux下学习C的时候使用了math库的一个函数fmod结果使用GCC编译,正常在链接的时候提示 undefined reference to fmod XXX原来GCC 默认是不链接数学库的 libm.a需要指定一下参数gcc -lm main.c其中 -l 表示链接选项m表示数学库 libm-lm 是简称如果链接 libst.a那就是原创 2016-08-05 23:56:57 · 4798 阅读 · 0 评论