Linux中的文件I/O缓冲
近日阅读《Linux/UNIX系统编程手册》第13章 - 文件I/O缓冲,有些收获,是以此文以记之。以往只知道Linux的I/O操作有缓冲机制,但始终不知道具体的缓冲流程及使用方法。读完本章节后方才有种恍然大悟的感觉,久违的因读书而觉得舒爽的感觉。 好了,进入正题,下图摘自原文(13.4-I/O缓冲小结),此图概括了stdio库及内核针对输出文件所用的缓冲以及各类缓冲的控制机制。本文依据此图逐步揭开文件I/O缓冲的面纱。 I/O缓冲的类型在使用stdio库中文件写操作相关的函数(如:printf, fputc, fputs, fwrite)时,待写入数据从用户空间内存到内核空间内存、再到磁盘会经过以下3类缓冲 stdio库的缓冲区 文件I/O的内核缓冲区的高速缓存 磁盘驱动器内置高速缓存 下面逐一介绍。 stdio库的缓冲 如上图所示,stdio库实现的缓冲位于用户空间内存当中,该缓冲区A会缓冲大块的文件数据以减少系统调用(如: read, write)。 需要知道的是,stdio库函数内部会调用底层的系统调用,如fgets调用read,fputs调用write。但是在...
Linux指令 - tee的实现
近日学习《Linux/UNIX 系统编程手册》一书,巩固了C语言中一些常用库函数的使用,主要涉及基本IO操作相关的库函数。为了加深理解,手动实现了Linux系统中的tee指令的功能。借此文记述实现过程。 tee功能简述tee类似于一个单输入双输出的三通管道,将标准输入的数据输出到指定文件和标准输出中。为实现这个指令,主要考虑以下几点: 解析tee包含的命令行参数 读取标准输入数据,并将数据写入标准输出和指定文件 若未指定文件,则仅将数据输出到标准输出 下面逐步分析每个要点的实现方法。 参数解析tee包含以下可选项,本文实现仅考虑-a,--version,--help Usage: tee [OPTION]... [FILE]... Copy standard input to each FILE, and also to standard output. -a, --append append to the given FILEs, do not overwrite -i, --ignore-interrupts ignore inte...
OpenWrt中使用gdb分析coredump
近日调试一个bug,一个守护进程在特定情况下执行一段程序后便会挂掉。为了分析bug产生原因,本人使用了printf, strace追踪,gdb调试等诸多调试工具和测试方法。本文对于在OpenWrt嵌入式系统中启用gdb功能及其使用方法进行详细说明。 调试背景我最先通过strace工具追踪发现进程是在收到SIGABRT信号后被kill的。 pipe([8, 9]) = 0 fcntl64(8, F_GETFL) = 0 (flags O_RDONLY) ioctl(8, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbe90a454) = -1 EINVAL (Invalid argument) rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0 tgkill(14189, 14189, SIGABRT) = 0 --- SIGABRT (Aborted) @ 0 (0) --- Process 14...
网页模板pug基本语法
Pug – robust, elegant, feature rich template engine for Node.js pug原名jade,因版权问题更名为pug,即哈巴狗。与hexo默认模块ejs一样,pug也是一个模板引擎,可用于快速的网站开发,当然也可以用于静态博客网站的设计。本站点现时所用主题manupassant也使用了pug。 本文针对Hexo中使用pug的情况为例,说明其基本语法。 安装# common install npm install pug # install for hexo blog npm install hexo-renderer-pug --save 语法pug不同于html,前者不需要标签的开和闭,如html的<p>Demo</p>,在pug使用p Demo即可。 缩进pug对空格敏感,有点类似python对制表符tab敏感。pug使用空格作为缩进符,当然用soft tab也可行。同一级标签需保证左对齐。 div p Hello, world! p Hello, pug. 渲染结果如...
Python实现快排及其可视化
最近装了个Anaconda,准备学习一下数据可视化。本着三天打鱼两天装死的心态,重新抱起崭新的算法书,认真学起了快排算法。学完后用Python实现了一遍基本的快排,然后使用matplotlib进行动态绘图,最后使用imageio生成GIF图片。谨以此文以记之! 快排基本原理快排采用和归并排序相同的分而治之的思想,将待排序数组分成左右两个子数组,对两部分子数组独立排序。当子数组均有序时,整个数组也就有序了。 排序步骤如下: 将原始数组data随机打乱,以消除对输入的依赖(本步可选) 选择数组的首个元素data[0]作为切分元素v 切分数组 从左往右找到第一个大于切分元素v的元素data[i] 从右到左找到第一个小于切分元素v的元素data[j] 交换data[i]与data[j] 重复以上三步直到i>=j 交换data[j]与切分元素data[0] 递归调用,对切分后的左侧子数组进行排序 递归调用,对切分后的右侧子数组进行排序 文字性的描述总是那么苍白无力,但还好也能说明一些问题。可以看出,快排的关键在于切分,切分后的数组应该满足: 切分元素的位置(设为j)已经固定...
tmux常用配置说明
tmux作为Linux三大神器之一,结合zsh和vim堪称无敌,tmux作为分屏利器自有其强大之处,本文就其常用配置予以说明。 安装tmux# install in ubuntu $ sudo apt-get install tmux Ctrl+B: default keys of tmux prefix .tmux.conf: config file of tmux tmux source-file .tmux.conf: command to reload .tmux.conf 禁止自动更新窗口名称默认情况下,tmux会根据当前目录及相关操作自动更改窗口名称,但通常情况下,我们是不需要其修改的,为此可以在配置文件中添加: setw -g allow_rename 'off' 设置zsh作为默认shell如果先安装的tmux, 后安装和配置zsh,那tmux有可能默认打开使用的是bash,此时可以使用以下配置指令予以更改: set-option -g default-shell /bin/zsh 设置vim作为默认编辑器在tmux的搜索模式prefix+[下,默认...
Openwrt中添加内核模块
如果想要在Openwrt系统中添加一个内核模块,其实并不难,对着某个已有的内核模块,依葫芦画瓢嘛,不难。本文将介绍一个最最简单的 sourcecodepath: git_repo/package/kmod-demo/ 下面是源码包含的所有文件,根级Makefile提供给内核编译器使用,src级Makefile用于编译.ko文件。 $ tree . ├── Makefile └── src ├── demo.c ├── Kconfig └── Makefile demo.c源码非常简单,在装载时打印Hello World,卸载时打印Exit。 #include <linux/module.h> #include <linux/kernel.h> static int __init hello_init(void) { printk("Hello World\n"); return 0; } static void __exit hello_exit(void) { printk("Exi...
Python网络爬虫4 - scrapy入门
scrapy作为一款强大的爬虫框架,当然要好好学习一番,本文便是本人学习和使用scrapy过后的一个总结,内容比较基础,算是入门笔记吧,主要讲述scrapy的基本概念和使用方法。 scrapy framework首先附上scrapy经典图如下: scrapy框架包含以下几个部分 Scrapy Engine 引擎 Spiders 爬虫 Scheduler 调度器 Downloader 下载器 Item Pipeline 项目管道 Downloader Middlewares 下载器中间件 Spider Middlewares 爬虫中间件 spider process其爬取过程简述如下: 引擎从爬虫获取首个待爬取的链接url,并传递给调度器 调度器将链接存入队列 引擎向调度器请求要爬取的链接,并将请求得到的链接经下载器中间件传递给下载器 下载器从网上下载网页,下载后的网页经下载器中间件传递给引擎 引擎将网页经爬虫中间件传递给爬虫 爬虫对网页进行解析,将得到的Items和新的链接经爬虫中间件交给引擎 引擎将从爬虫得到的Items交给项目管道,将新的链接请求requests交给调...





