linux cat命令源码,Linux cat 命令源码剖析

Linux cat 命令源码剖析

最近在读APUE, 边看还得边做才有效果. 正好Linux下很多命令的是开源的, 可以直接看源码. GNU coreutils 是个不错的选择. 源码包有我们最常用的 ls, cat等命令的源码, 每个命令都比较短小精悍, 适合阅读. 下面是我阅读 cat 命令的一点笔记.

到这里下载源码. 在源码根目录下 ./configure; make 就可以直接编译, 修改后make就可以编译了. 命令源码在 src/目录中, lib/目录下有一些用到的辅助函数和常量定义.

1. 命令行解析

基本上所有的Linux命令都是用getopt函数来解析命令行参数的, cat也不例外, cat使用的是getopt_long函数, 以便解析长参数, 用一些bool变量来存储选项值. 没什么好说的.

2. 检测输入输出文件是否相同

例如 cat test.txt > test.txt 的情况, 输入输出文件相同, 这是不合法的.

cat 的输入流由命令行给定, 默认是标准输入(stdin), 输出流是标准输出(stdout). 所以用字符串比较的方法是无法判断输入输出是否是相同. 另外对于一些特殊的文件, 如tty, 我们是允许其输入输出相同的, 如 cat /dev/tty > /dev/tty 是合法的. cat采取的方式是对与regular file, 检测设备编号和i-node是否相同. 忽略对非regular file的检测. 这部分的代码如下:

获得文件属性.

if (fstat (STDOUT_FILENO, &stat_buf) < 0)

error (EXIT_FAILURE, errno, _("standard output"));

提取文件设备编号和i-node. 对于非 regular 类型的文件, 忽视检测.

if (S_ISREG (stat_buf.st_mode))

{

Linux cat 命令源码剖析 最近在读APUE, 边看还得边做才有效果. 正好Linux下很多命令的是开源的, 可以直接看源码. GNU coreutils 是个不错的选择. 源码包有我们最常用的 ls, cat等命令的源码, 每个命令都比较短小精悍, 适合阅读. 下面是我阅读 cat 命令的一点笔记. 到这里下载源码. 在源码根目录下 ./configure; make 就可以直接编译, 修改后make就可以编译了. 命令源码在 src/目录中, lib/目录下有一些用到的辅助函数和常量定义. 1. 命令行解析 基本上所有的Linux命令都是用getopt函数来解析命令行参数的, cat也不例外, cat使用的是getopt_long函数, 以便解析长参数, 用一些bool变量来存储选项值. 没什么好说的. 2. 检测输入输出文件是否相同 例如 cat test.txt > test.txt 的情况, 输入输出文件相同, 这是不合法的. cat 的输入流由命令行给定, 默认是标准输入(stdin), 输出流是标准输出(stdout). 所以用字符串比较的方法是无法判断输入输出是否是相同. 另外对于一些特殊的文件, 如tty, 我们是允许其输入输出相同的, 如 cat /dev/tty > /dev/tty 是合法的. cat采取的方式是对与regular file, 检测设备编号和i-node是否相同. 忽略对非regular file的检测. 这部分的代码如下: 获得文件属性. if (fstat (STDOUT_FILENO, &stat_buf) < 0) error (EXIT_FAILURE, errno, _("standard output")); 提取文件设备编号和i-node. 对于非 regular 类型的文件, 忽视检测. if (S_ISREG (stat_buf.st_mode)) {
经验分享 程序员 微信小程序 职场和发展