基于Linux系统的流量控制程序的C语言代码

基于Linux系统的流量控制程序的C语言代码

mytbf.h头文件

ifndef MYTBF_H_
#define MYTBF_H_

typedef void mytbf_t;

mytbf_t *tbf_init(int bits,int max);

int gettoken(mytbf_t *tbf,int tknum);

int returntoken(mytbf_t *tbf,int rtnum);

int tbffree(mytbf_t *tbf);

#endif

mytbf.c文件

#include <stdio.h>
#include <stdlib.h>
#include <mytbf.h>
#include <signal.h>

struct tbf_t
{
    int bits;
    int token;
    int maxtoken;
};

struct tbf_t *data=NULL;
int initflag=1;

void sigdo(int s)
{
    data->token=data->token+data->bits;
    if(data->token>=data->maxtoken)
        data->token=data->token;
    alarm(1);
}

mytbf_t *tbf_init(int bits,int max)
{
    data=malloc(sizeof(*data));
    if(bits < 0)
        return NULL;
    if(bits > max)
        return NULL;

    data->bits=bits;
    data->token=bits;
    data->maxtoken=max;

    if(initflag)
    {
        signal(SIGALRM,sigdo);
        alarm(1);
        initflag=0;
    }

    return data;
}

int gettoken(mytbf_t *tbf,int tknum)
{
    int min;
    data=(struct tbf_t *)tbf;
    if(tknum < 0)
        return -1;
    if(tknum > data->maxtoken)
        return -2;

    while(data->token == 0)
        pause();

    min=data->token > tknum ? tknum:data->token;
    data->token=data->token-min;

    return min;
}

int returntoken(mytbf_t *tbf,int rtnum)
{
    data=(struct tbf_t *)tbf;
    if(rtnum < 0)
        return -3;
    if(data->token > data->maxtoken-rtnum)
        data->token=data->maxtoken;
    else
        data->token=data->token+rtnum;
    return 0;
}

int tbffree(mytbf_t *tbf)
{
    free(tbf);
    return 0;
}

mycat.c文件:实现Linux终端命令cat的功能,显示文件内容,不过为这个程序加上了流量控制。

#include <stdio.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>

#include <mytbf.h>

#define SIZE 20
#define MAXSIZE 500
static int fd;

void func_closefile()
{
    close(fd);
}

int main(int argc,char **argv)
{
    char buff[SIZE];
    int res;
    int res1;
    int retnum;
    mytbf_t *tbf;
    if(argc<2)
    {
        fprintf(stdout,"出错,命令后没有文件名!\n");
        exit(-1);
    }

    do{
        fd=open(argv[1],O_RDONLY);
        if(fd < 0)
        {
            if(errno == EINTR)
                continue;
            perror("open()");
            exit(-2);
        }
    }while(fd < 0);

    atexit(func_closefile);

    tbf = tbf_init(SIZE,MAXSIZE);

    while(1)
    {
        retnum=gettoken(tbf,MAXSIZE);
        res = read(fd,buff,retnum);
        if(retnum-res > 0)
        {
            returntoken(tbf,retnum-res);
        }

        if(res==0)
            break;
        if(res<0)
        {
            if(errno == EINTR)
                continue;
            perror("read()");
            exit(-3);
        }

        do{
            res1 = write(1,buff,res);
            if(res1 < 0)
            {
                if(errno == EINTR)
                    continue;
                perror("write()");
                exit(-4);
            }
        }while(res1<0);
    }
    tbffree(tbf);
    exit(0);
}


`

猜你喜欢

转载自blog.csdn.net/qq_42249237/article/details/81588317