Unix/Linux编程实践教程–cat在OS X的实现

环境:OS X 10.12.4

cat 这玩意儿在哪个Unix平台实现都一样吧- -

cat这个程序是把参数中的文件名的文件内容输出到标准输出,如果参数中没有文件名,默认是把标准输入的内容输出到标准输出

这里使用了utmplib类似的代码用于缓存数据,减少系统调用的使用。

代码
cat.c

#include <stdio.h>

void xc_open(char *aFName);
void xc_close(void);
int xc_getchar(void);
void xc_readFromStdin(void);

/* use xc_file.c to read from file */
/* concatenate files and print on the standard output */
int main(int ac,char *av[])
{
    int ch;
    if(ac > 1){
        while(--ac){
            xc_open(*++av);
            while((ch = xc_getchar()) != EOF)
                putchar(ch);
            xc_close();
        }
    }else{
        xc_readFromStdin();
        while((ch = xc_getchar()) != EOF)
                putchar(ch);
    }
    return 0;
}

xc_file.c

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

/* BUFSIZ define in stdio.h,commonly is 1024 */
static unsigned char chBuf[BUFSIZ];
static int fd = -1;
static char fName[BUFSIZ];
static int chCur;
static int chSum;

void xc_readFromStdin(void)
{
    /* define in unistd.h */
    fd = STDIN_FILENO;
}

void xc_open(char *aFName)
{
    if((fd = open(aFName,O_RDONLY)) == -1){
        perror(aFName);
        exit(1);
    }
    strcpy(fName,aFName); /* record which file is opened */
    chCur = chSum = 0;
}

int xc_reload(void)
{
    int bytes_read;
    if((bytes_read = read(fd,chBuf,BUFSIZ)) > 0){
        chCur = 0;
        chSum = bytes_read;
        return chBuf[chCur++];
    }else if(bytes_read == -1){
        perror(fName);
        exit(1);
    }else if (bytes_read == 0)
        return EOF;
}

int xc_getchar(void)
{
    if(fd == -1)
        return EOF;
    if(chSum == chCur)
        return xc_reload();
    return chBuf[chCur++];
}

void xc_close(void)
{
    if(fd != -1)
    {
        if(close(fd) == -1){
            perror(fName);
            exit(1);
        }
        fd = -1;
    }
}

相关文章

普通模式 >G 增加当前行到文档末尾处的缩紧层级 $ 移动到本行的末尾 . 相当于一个...
原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属...
原文连接: https://spacevim.org/cn/layers/lang/dart/ 模块简介 功能特性 依赖安装及启用模块 启用模...
 =   赋值操作符,可以用于算术和字符串赋值 +        加法计算     -        减法运算...
1.根据包名来查看指定的APP指定数据 adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数...
ctrl+F 向下翻页 ctrl+B 向下翻页 u 取消最近一次操作 U 取消当前行的操作 ZZ 保存当前内容并退出 gg 跳...