1. 程式人生 > >Unix/Linux程式設計實踐教程–cat在OS X的實現

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; } }