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



`

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值