UNIX 终端I/O

介绍 我阅读并且学习了有关于 UNIX 系统终端 I/O 相关的内容。在此记录一些比较关键的概 念。 引论 终端 I/O 十分复杂,原因之一是它应用于许多事物。 综述 终端 I/O 的两种工作模式:规范模式输入处理(默认)、非规范模式输入处理。 规范模式下,对于每一个读请求,终端驱动程序最多返回一行。 可以认为终端设备是由内核中的终端驱动程序控制的,每一个终端设备都有一个输入队列和 一个输出队列。 开启回显功能时,在输入队列和输出队列之间有一个隐含连接。 输入队列长度是有限值。 输出队列虽然也有限,但是程序并不能获取这个值。在输出队列要填满时,内核会直接将写 进程休眠。 大多是 UNIX 系统在一个称为终端行规程的模块中进行全部的规范处理。该模块在内核通用 读写函数和实际设备驱动程序之间。 所有可以检测和更改的终端设备特性都包含在 termios 结构中。 使用 tcsetattr 和 tcgetattr 可以设置终端选项进而控制终端。 特殊输入字符 POSIX 定义了 11 个在输入时要特殊处理的字符。在这 11 个特殊字符中,9 个字符的值可 以任意更改。 为了更改特殊字符,需要修改 termios 结构中的 c_cc 数组的相应项。 POSIX 允许禁止使用这些字符。 终端标识 在大多数 UNIX 系统版本中,控制终端名字一直是/dev/tty。 规范模式与非规范模式 规范模式:发送一个请求,当一行已经输入以后,终端程序立即返回。以下几个条件造成读 返回: 所请求的字节数已经读到时,无需读一个完整的行。 当读到一个行界定符号 捕捉到信号,并且该函数不再自动重启 非规范模式:时输入数据不装配成行,不处理特殊字符。当读取指定量的数据后,或者超过 指定量的时间后,通知系统返回。该模式下没有关闭对信号的处理,用户始终可以键入一个 触发终端产生信号的字符。 终端窗口大小 大多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的方法,当窗口大小变化的时候,使 内核通知前台进程组。内核未每个终端和伪终端都维护了一个 winsize 结构。 ...

2021年2月10日

通过Gparted Live ISO可引导镜像调整硬盘分区大小

介绍 手上有一张安装了 Openwrt 的 8G 的 TF 卡,根分区的容量已经不太能够满足我的使用需 求了。所以开始着手扩大根分区的大小。根分区的所使用的的文件系统格式是 Ext4。首 先,尝试使用 DiskGenius 等 Windows 下的工具进行扩容,很遗憾都不可以。于是准备使 用 Gparted 进行扩容。由于该工具需要在 Linux 环境下运行,我不太想安装为此安装一个 Linux 发行版虚拟机所以使用 Gparted 的轻量 ISO 镜像配合 Virtual Box 虚拟机进行使 用。 准备工作 首先下载安装 VritualBox 虚拟机和 VM VirtualBox Extension Pack。VirtualBox 并默认 不支持 USB 外设操作,所以要安装而外后者来为 VirtualBox 添加 USB2.0、USB3.0 等外 设支持。 VirtualBox 下载地址 VM VirtualBox Extension Pack 以上两者下 载完后,先安装 VirtualBox。 然后安装 VM VirtualBox Extension Pack,具体在首选项 界面扩展栏目中安装。 下载 GParted Live CD/USB/HD/PXE Bootable Image,下载链 接。 步骤 创建虚拟机,分配单核、内存 512MB 即可,可以不创建虚拟硬盘。 在虚拟机设置界面中, 在 USB 设备栏目中启用 USB 控制器,根据需要选择 USB2.0 或者 USB3.0。 在储存栏目光 驱下,选择下载好的 ISO 镜像,启动虚拟机。 在第一个引导菜单中选择第一项。 而 后,按步骤一次选择或者输入Dont touch keymap, 26(简体中文),0(启动 X Window 系统)。 然后就能够进入图形界面了,点击桌面上的 Gparted 工具镜像分区操作。 分 区后,记得点击应用。 ...

2021年2月9日

YouCompleteMe C/C++ VIM CMake 工程 代码提示不可用问题

YouCompleteMe 介绍 如果安装完YouCompleteMe并配置好后 (本站有过程记录,点击这里查看),就可以 使用单文件来检测代码提示效果了。但是,当 S&E 打开他的 C/C++工程时,却发现代码提 示、跳转等功能不能正常使用。在查阅文档后,S&E 发现原来是 YouCompleteMe 相关的索 引数据库没有建立,相关的编译选项并不正确,所以 YouCompleteMe 所使用的的 clangd 就不能将多个源文件联系起来。 建立 C/C++ VIM 代码提示索引的方法 如果是使用 CMake 建立工程,则可以在 CMakeList.txt 中加入 set( CMAKE\_EXPORT\_COMPILE\_COMMANDS ON ) 或者在命令行 cmake 后加上-DCMAKE_EXPORT_COMPILE_COMMANDS=ON也行 建立索引的原理 YouCompleteMe 读取由构建系统 CMake 生成的编译数据库(通常名字叫做 compile_commands.json),这样就可以完成对于工程文件的索引。而编译数据库包含项目 中每个编译单元的编译器调用。YouCompleteMe 会寻找打开文件所在目录中的 compile_commands.json,如果没找到会递归地向上查找这个文件。如果在它找到 .ycm_extra_conf.py 之前,找到了 compile_commands.json,那么它就会停止搜索,然 后,让 clangd 处理接管并处理该文件中含有的标志。 在完成上述这些操作 后,YouCompleteMe 的相关功能就可以正常使用了。

2021年2月6日

Vim 代码提示插件 YouCompleteMe 安装与配置

介绍 对于在 Vim 下的 C/C++程序编写,如果有代码提示插件会大大提高编写效率。大型 IDE 用 的多了,刚回归 Vim 的 S&E 比较依赖这个。正好 YouCompleteMe 能够满足他的相关需 求。索性把安装与配置的过程记录在这里,以供下次回忆使用。 除了 C/C++,YouCompleteMe 支持 Java、Go、C#、Objective-C、CUDA 等,可以说是比较强大 了。但是话说,写 Java 为什么要用 Vim 呢?IDEA 貌似更好。 使用后发现这插件还支持 代码跳转、引用查找、修改函数名和格式调整等操作,挺方便。 Giuhub 仓库地 址:https://github.com/ycm-core/YouCompleteMe 前置条件 安装最新的 YouCompleteMe 插件需要满足一些条件 Vim 8.1 以上 并且启用了 Python3 扩展支持(本站有过程记录,点击这里查 看) GCC 8 以上 或者 Clang 7 以上 Python3.6 以上编译的时候有–enable-shared 选项(一般包管理器安装都带有) 对于 Debian 10, 通过包管理器安装的 Gcc 版本为 8.3.0。 然后可以通过以下命令查看 编译器版本 % cc -v 对于 python3 的版本,使用以下命令查看 % python3 --version 对于 Vim 版本,使用执行以下命令查看 ...

2021年2月6日

Vim主题 spf13-vim.sh 的安装与使用

Vim 主题介绍 我经常使用 vim 为在 Linux 下的主要的代码编辑器。每当 SSH 进入一个新的开发系统环 境,为了编写方便,他总是需要手动安装 Vim 并配置各类常用插件。spf13-vim.sh 是一个 使用于 Vim 的插件和相关资源的发行版。一条命令,即可以自动安装常用的配套的插件环 境。 Github 仓库地 址:https://github.com/spf13/spf13-vim 心得 我感觉这个就好像快速安装了一个以 Vim 为核心的 IDE(可以类比 Vscode)。然 后,spf13-vim.sh 产生一个比较规范的 vim 配置文件层次结构,方便后来再添加其他插 件,也避免无规划地手动添加插件产生的杂乱的配置文件。而且,把相关插件的优化和配置 工作丢给它后,省心了不少。 安装 前置条件: git curl vim 7.3 以上 本站有安装 Vim 8.2 的相关过程记录:点击这里查 看 对于 Debian 10 可以简单地执行以下命令安装 git 和 curl % sudo apt install git curl 然后对于 Unix/Linux、Mac OS 等,执行以下命令一键安装 spf13-vim.sh % curl https://j.mp/spf13-vim3 -L > spf13-vim.sh && sh spf13-vim.sh (对于 Windows 系统,请参考 Github 仓库中的 ReadME.md) ...

2021年2月6日

Vim 8.2 源码编译安装 添加Python3扩展

介绍 为了安装 YouCompleteMe 这类插件,需要将 Vim 升级至比较高的版本并且启用 Python3扩 展。所以,这里提供的是通过源码安装 Vim 最新版本的过程记录。 这里使用到的 Vim源代 码仓库地址:https://github.com/vim/vim/ 编译安装默认版本 在编译安装之前先要安装相关的工具以及依赖 % sudo apt install git make clang libpython3-dev 选择适当的目录执行克隆命令 % git clone https://github.com/vim/vim.git 克隆成功后会出现 vim 目录,进入该目录下的 src 目录 % cd vim/src 执行编译(为了加快速度可以替换执行% make -j4来并行编译) % make 执行测试 % make test 默认安装到/usr/local 目录下 % sudo make install 开启Python3扩展支持 在上述操作完成后,打开该目录下的Makefile文件,找到"CONF_OPT_PYTHON3 = --enable-python3interp"并取消注释该行,保存。 执行命令更新编译参数make reconfig

2021年2月6日

知行论(四)

所知,虽然是对于一个人的所知。但是对于处世是有益处的。所知愈多,所思就会越深刻。 但是这种知不是一味的去知。要知道世界上没有绝对正确的知,没有全部清楚的知,没有绝 对权威的知,没有处于本真的知。有人要是说他有真知,这是不可能的。神要是说他有真 知,我不知道它到底有没有。如果一味接受外来的知,这些知就是死的知。死的知是没有去 进行析的过程的知。没有我用我所知去析这些知,转化为我之知而被我所用。我不这样做。 这种知不是我之知,就不能真正被我灵活运用,我只是知罢了。若如果没办法运用的的话, 就不能将它用于思。如果一味的接受外来的知,我是没有能力全部析这些知的。一味接受外 来的知的人,也是没有析这个过程的,这些知是不能够被他们灵活运用的。我不这样做。能 够析,有所领悟是一件快乐的事。能有所知,有所析,有所知,有所法,行才能够成功。知 之,析之,思之,是知的道理。 所行,成功了。如果我们以为所行之法就是通用的,认为 此法是绝对了,这就错了。成功之法,是根据所知,所思产生的。成功的道路上有的变数是 我所不知道的。变数没有改变,法是畅行的的。如果改变的话,法就不能畅通,就不能让行 成功。所以说古无定知,行无定法。我得到了法,我按照它来行,它让事物发生了改变。但 是事物的改变确实是它本源发生了改变,但是我只能感知到我所能够感知的变化。简单的变 化可以感知,但是其复杂的变化是难以感知的。所以,行要谨慎,不骄傲。谨慎的人是有很 大的灵活性的。使用法,骄傲的人是不会变通的。但是谨慎的人能够应对多样的变化。谨慎 的人得以使用他们全部所知,全部所思来使用法。不谨慎的人只能看到事物的表象武断地判 断。这样会有所损失的。所以谨慎而行,不轻率,成功的方法。谨慎的人可以应对万变,能 够运用上他们全部的所知所思,容易让行法的过程顺畅。法也在他们使用的过程中畅顺。

2018年5月26日

知行论(三)

行的过程中,我们一定有目标。但是众人渴求目标迫切想要达到目标,是不容易得到的。应 当处在不求的状态,但心中知道有这个目标。迫切想达到,心里必然渴,这样就不能达到静 的状态,不静就会浮躁,浮躁就会缺失很多东西。这样所知是片面的,所思也是不周全的。 所以,处于静的状态不渴求才是行的方法。心思不全放在目标上,这样知的范围就可以广很 多,像平常一样,这样才可能成功。 行的过程中,要用心。用心,就必然要专心。心不专 一是达不到目标的。心不专一,我所知与所思不能全部发挥出来。怎么心专一,行事前一定 要有所知,有所思,让所思产生法。有所知,还没有行之时心就能专一。有所思,有所法而 行,心就能定。无思则无法,心就会乱。能够聚集心神的心就能专心。心神如果是散开的 话,心就是乱的。什么是心专一,心里没有杂念,没有其他的事。专心的人行的时候才能够 顺畅,才可能成功。

2018年5月26日

知行论(二)

论及行。行,是难做到的。我们认为我们获得了知,我们就能够行。并不是这样的,事物的 变化难以预料,这不是我们可以预先知道的。所以行必须谨慎,用来防范难以预料的变化。 事物的变数多是行难的原因之一。 知行并不是合二为一的。我们认为知了就行,认为行一 定会成功。知道了规律方法后就去行。但我们所知道的规律方法,其运用到的情况都是我们 构想出来的,我们所举得出的例子,所能够想得出的细节,都是源于我们的思。我们所思, 会出现荒谬的地方,不周全的地方。若果就这样行的话,如果遇到我们所思之外的细节,我 们就会慌。如果出现我们所思之外的例子,我们的行就会停止。我们时常行,才是成功的方 法。怎么行,先知然后行。怎么知,行后自然知。 我行的途中,一定会有言论制止我。会 有言论论及我的行的错误之处,我的知的错误之处。如果我就这样听从了,停止了,是不能 成功的。如果我一点都听不进去,一意孤行,也难以成功。该怎么办。他人所论及的,他人 所知的,都是处于他人所感知的,所思,所行而形成的。没有所谓的绝对真知,也没有所谓 的权威之知,更没有什么永恒不变之知。我会观察这些论断的表象,揣测它们的本意,虽然 不能得到它们本源的意思,但是一定会有所收获。所以,我们不妨听之,思之,用行来检 验。如果确实有用,我们就用,但不是盲从。如果不行,就坚持我们的见解。知之,在行之 的时候要时常思之,这是好事。行有了成功的结果,就是行就是成功的。虽然造成成功的结 果的方法可能不适用于所有情况,但对于我自己的角度,它就是成功的。所以,我之行能否 成功,是不能凭借他人所说来预测的。

2018年5月26日

知行论(一)

出于偶然,我写下了这些文字。由于一些原因,我比较浮躁,而写这些东西能让我静得下心 来。这些文字关于一些理论。这也是一把哲学的武器与防具,集合成理论后就能够变得锋 利,变得坚固。它能够帮助我经受住生活上的挑战。知行论只是其中之一。它源于我的生 活,我读过的书,我的思考。以下进入正文。 论及知,我们用眼睛观察事物,用耳朵听它 的声音,用手去抚摸它感受它,我们就认为我们感知了这个事物。我们用大脑思考这件事, 用心去感知它,我们就认为我们了解了这件事物。但是,我们所看见的,所听到的,所抚摸 到的,都是我们的感官能够感觉到的。我们怎么知道我们的感官感觉到的是事物的本真呢? 我们感知事物只能够凭借感官,它们感知的事物是怎么样的源于它的构造,哪能不能够存在 一套构造完全不同的感官,它们感觉到的事物的样子与我们的毫不相同呢。这是存在的,那 么说明我们没有能力知道事物的本质。 我们所思想的,我们所能够感知的都出自于我们的 脑心,但是我们的脑心都是外力所塑造的,并且我们所思都是含有我们的愿望在其中的。什 么是我们的愿望呢?我们的心思是寄托在我们的身体上的。我们身体受到伤害,伤害我们的 脑心会觉得伤心;我们的身体得到了什么,我们的脑心也会欢喜。我们的所思也蕴含有其他 人的思想。我们生下来是一张白纸,我们的老师教我们知识,我们老师所教的知识,也是我 们老师的老师教给他的。所以我们知识源于他人的脑心,他人所思蕴含于知识中并通过教授 传给我。所以我们所思都是从我们的角度出发的,并不是关于事物本质的思。我常常以为思 考的越深入就越接近事物的本真,然而并不是这样。我所思,其实是将事物用我的感觉读入 脑心之中,然后以我的方式加工。 这样所感知的事物,所了解的事物都不是事物的本质。 这样我就知道了,事物的本源是不能准确被感知的。事物的真理也是不能被准确思考的。这 就是知的局限性。

2018年5月25日