基于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);
}
————————————————
版权声明:本文为CSDN博主「风翼随心」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42249237/article/details/81588317
光锥极客 2019-11-24 阅读量:2267