系统编程之模拟tail命令

Posted 年糕君の勉强笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统编程之模拟tail命令相关的知识,希望对你有一定的参考价值。

如果是做作业的孩子找到了这里,希望不要直接copy,供参考,其实我做的也不一定好嘻嘻。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<fcntl.h>
#define BUFFERSIZE 512
char *file;
int getRows(){
    int chars,i,rows=0,fd;
    char buf[BUFFERSIZE];
    fd=open(file,O_RDONLY);
    if(fd==-1)
        return -1;
    while((chars = read(fd, buf, BUFFERSIZE)) > 0){
        i=0;
        while(i<chars){
            if(buf[i]==\n)
                rows++;
            i++;
        }
    }
    close(fd);
    return rows;
}
int toInt(char *str){    
    int res=0;
    int now=1;
    int len=strlen(str);
    int i=len-1;

    while(i>=0){
        res=res+(int)(str[i]-0)*now;
        now*=10;
        i--;
        if(i==0 && str[i]==-){
            return res;
        }
    }
    return res;
}

int isValid(char *str){
    int len = strlen(str);
    int i=0;    
    if(len>=2 && str[0]==-) i=1; 
    for(;i<len;i++){
        if(str[i]<=0 || str[i] >= 9)
            return -1;
    }
    return 1;
}

void readFile(int isOk,int allRows,int num){
    int chars;
    char buf[BUFFERSIZE];
    int i,cur=0;
    int fd=open(file,O_RDONLY);
        if(isOk==1){
               while((chars = read(fd, buf, BUFFERSIZE))>0){
                    i=0;
                        while(i<chars){
                            if(cur>=(allRows - num)){
                                printf("%c",buf[i]);
                            }    
                            if(buf[i]==\n){
                                cur++;
                            }    
                            i++;
                        }
                }
             close(fd);
        }
}
int main(int argc,char **argv){
    int ch,fd,cur;
    int num=10,isOk=1;
    int allRows;

    long time1,time2;
    struct stat buf;
    file = (char*)malloc(100*(sizeof(char)));
    
    if(argc==1){
        strcpy(file,"a.txt");
    } else if(argc==2 && strcmp(argv[1],"-n")==0){
        printf("Please input like -n [number] [filename]\n");
        return;
    } else if(argc==2 && strcmp(argv[1],"-n")!=0){
        strcpy(file,argv[1]);
    }else if(argc==4){
        strcpy(file,argv[3]); 
    } else {
        printf("Please input like [filename] / -n [number] [filename]\n");
        return;
    }
    
    allRows = getRows();
    
    if(allRows == -1){
        printf("File not exists\n");
        return;
    }
    if(allRows < 10){
        num = allRows;
    }

    while((ch = getopt(argc, argv,"n:f::"))!=EOF){
        switch(ch){
            case n:
                if(isValid(optarg)==-1){
                    printf("The option ‘n‘ is not valid.\n");
                    isOk = 0;
                    break;
                }        
                num=toInt(optarg);
                if(num > allRows || num==0){
                    printf("The option ‘n‘ is over the max rows\n");
                    isOk = 0;
                    break;
                }
                break;
            case ?:isOk=0;break;
            default:break;
        }
    }
    readFile(isOk,allRows,num);
}

 

以上是关于系统编程之模拟tail命令的主要内容,如果未能解决你的问题,请参考以下文章

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

面向面试编程代码片段之GC

Linux之tail命令

linux命令之tail

Linux之tail命令

Linux命令详解之—tail命令