当前位置: 首页 > news >正文

信号的漏桶实现

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

}

相关文章:

  • 神聖的綫性代數速成例題20. 廣義逆矩陣的概念與計算、線性空間上的雙線性函數及其性質、歐幾里得空間中正交投影的應用
  • 牛客周赛84 题解 Java ABCDE 仅供参考
  • Window对象与本地存储详解
  • 重装系统后遗症之zotero篇——zotero配置
  • 同旺科技USB to SPI 适配器 ---- 多适配器、多从机混合调试
  • 文件操作助手
  • 2025年渗透测试面试题总结-某360-企业蓝军面试复盘 (题目+回答)
  • 网站备份 工具,如何使用网站备份工具进行网站备份
  • MSIL入门
  • 测试用例`
  • 【橘子网络】关于网络分层以及协议的全局讲解
  • 小智物联网开发:为小智安装“机械臂“(其实就是加个舵机进行语音控制)
  • win32汇编环境,网络编程入门之九
  • 2025年了,5G还有三个新变化
  • unityAB包(2/2)
  • 性能测试笔记
  • asp.net进销存软件WEB进销存ERP软件库存玻璃行业
  • MySQL 5.7升级8.0报异常:处理新增关键字
  • [ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1)
  • 【北京大学】DeepSeek内部研讨系列:DeepSeek原理和落地应用
  • 5名中国公民在美国交通事故中遇难
  • 几天洗一次头发最好?终于有答案了...
  • 五一期间全国高速日均流量6200万辆,同比增长8.1%
  • 澎湃回声丨23岁小伙“被精神病8年”续:今日将被移出“重精”管理系统
  • 抗美援朝老战士宁昭逝世,享年93岁
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM