加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 16:55:50 所属栏目:安全 来源:网络整理
导读:环境:OS X 10.12.4 cat 这玩意儿在哪个Unix平台实现都一样吧- - cat这个程序是把参数中的文件名的文件内容输出到标准输出,如果参数中没有文件名,默认是把标准输入的内容输出到标准输出。 这里使用了utmplib类似的代码用于缓存数据,减少系统调用的使用。

环境: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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读