当前位置:

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

2019-11-24  作者:风翼随心    阅读:2088

基于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);

}




————————————————

版权声明:本文为CSDN博主「风翼随心」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_42249237/article/details/81588317