基于Linux系统的流量控制程序的C语言代码
程序员文章站
2022-06-03 08:51:55
...
基于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);
}
`
下一篇: Docker常用命令
推荐阅读
-
“C语言之父”40年前搞的操作系统复活!Linux、Windows都抄过它
-
Linux系统下的C语言练习:判断一个字符串是不是另一个字符串的子串,比如"ab"是"aabcd"的子串
-
用C语言实现linux下非root用户获取系统CPU的id
-
[linux] C语言Linux系统编程-TCP通信的11种状态
-
C语言实现ATM系统程序的完整代码
-
c语言实现系统(Linux)文件权限的修改,以及系统文件的创建,写入和读取数据
-
基于Linux系统的流量控制程序的C语言代码
-
“C语言之父”40年前搞的操作系统复活!Linux、Windows都抄过它
-
Linux系统下的C语言练习:判断一个字符串是不是另一个字符串的子串,比如"ab"是"aabcd"的子串
-
基于51单片机控制的篮球比赛计时、计分系统设计与仿真(含设计图和C语言程序源码)