信号的漏桶实现
1、一段时间内打印固定数据
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#include <fcntl.h>
#define SPEED 1024
#define BUFFSIZE SPEED
volatile static bool loop = false;
#define ALARM 3
static void alrm_handler(int signo)
{
alarm(3);
loop = true;
}
int main( int argc, char** argv)
{
if( argc < 2)
{
fprintf(stderr,"Usage:%s <src_file> \n",argv[0]);
exit(0);
}
int sfd,dfd = 1;
char buff[BUFFSIZE];
if( (sfd = open(argv[1],O_RDONLY))<0)
{
perror("open()");
exit(1);
}
signal(SIGALRM,alrm_handler);
alarm(3);
while(1)
{
while(!loop)
pause();
loop = false;
ssize_t read_size;
errno =0;
while((read_size = read(sfd,buff,BUFFSIZE)) < 0)
{
if( errno == EINTR)
{
errno = 0;
continue;
}
}
// read_size = read(sfd,buff,BUFFSIZE);
if( read_size == 0)
break;
if( read_size < 0)
break;
ssize_t write_size = 0;
errno = 0;
while( read_size)
{
ssize_t ret = write(dfd,buff+write_size,read_size);
if( ret < 0 && errno != EINTR)
{
break;
}
errno =0;
read_size -= ret;
}
}
close(sfd);
exit(0);
}
2、 实现令牌桶
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#include <fcntl.h>
#define SPEED 1024
#define BUFFSIZE SPEED
#define BURST 100
volatile static bool loop = false;
#define ALARM 1
volatile static int token =0;
static void alrm_handler(int signo)
{
alarm(ALARM);
// loop = true;
token ++;
if( token > BURST)
token = BURST;
}
int main( int argc, char** argv)
{
if( argc < 2)
{
fprintf(stderr,"Usage:%s <src_file> \n",argv[0]);
exit(0);
}
int sfd,dfd = 1;
char buff[BUFFSIZE];
if( (sfd = open(argv[1],O_RDONLY))<0)
{
perror("open()");
exit(1);
}
signal(SIGALRM,alrm_handler);
alarm(3);
while(1)
{
while(token <=0)
pause();
token--;
//loop = false;
ssize_t read_size;
errno =0;
while((read_size = read(sfd,buff,BUFFSIZE)) < 0)
{
if( errno == EINTR)
{
errno = 0;
continue;
}
}
// read_size = read(sfd,buff,BUFFSIZE);
if( read_size == 0)
break;
if( read_size < 0)
break;
ssize_t write_size = 0;
errno = 0;
while( read_size)
{
ssize_t ret = write(dfd,buff+write_size,read_size);
if( ret < 0 && errno != EINTR)
{
break;
}
errno =0;
read_size -= ret;
}
}
close(sfd);
exit(0);
}