基于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 
#include 
#include 
#include 

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 
#include 
#include 
#include 
#include 
#include 
#include 

#include 

#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);
}



`

你可能感兴趣的:(嵌入式编程,C语言,Linux,cat命令,数据流量控制)