使用select实现定时任务

selectOutOfTime.c里边的代码如下:

c 复制代码
#include<stdio.h>
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
#include <string.h>

#define BUF_SIZE 100

int main(void){
    fd_set reads;
    struct timeval tv;
    int errorNum;
    char send_line[BUF_SIZE];
    FD_ZERO(&reads);
    FD_SET(0,&reads);

    tv.tv_sec = 5;
    tv.tv_usec = 0;
    errorNum = select(1,&reads,NULL,NULL,&tv);// 原先以为第一个参数中,0 代表标准输入,1代表标准输出,这是错误的想法
    if (FD_ISSET(STDIN_FILENO, &reads)) {
            if (fgets(send_line, BUF_SIZE, stdin) != NULL) {
                int i = strlen(send_line);
                if (send_line[i - 1] == '\n') {
                    send_line[i - 1] = 0;
                }
                printf("input string: %s\n", send_line);
            }
        }

    if(errorNum == -1){
        perror("select()");
    }else if(errorNum){
        printf("Data is available now.\n");
    }else{//此处就是当errorNum = 0时,表明超时了
        printf("No data within five seconds.\n");
    }
    return 0;
}

可以看到这是一个简单的定时小程序,若是5秒内没有输入字符串,那么就会输出No data within five seconds.,然后程序退出;要是5秒内输入字符串了,那么就会先把input string:+刚刚输入的字符串输出到屏幕上,之后再输出Data is available now.,然后结束程序。
sudo gcc selectOutOfTime.c -o selectOutOfTime进行编译,sudo ./selectOutOfTime两次执行,对应上边的5秒内是否输出字符串的描述。

进行一下改动,就可以实现定时任务了,selectOutOfTimeWhile.c代码如下:

c 复制代码
#include<stdio.h>
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
#include <string.h>

#define BUF_SIZE 100

int main(void){
    fd_set reads, cpy_reads;
    struct timeval tv;
    int errorNum;
    char send_line[BUF_SIZE];
    FD_ZERO(&reads);
    FD_SET(0,&reads);

    while(1)
	{
        cpy_reads=reads;
        tv.tv_sec = 5;
        tv.tv_usec = 0;
        errorNum = select(1,&cpy_reads,NULL,NULL,&tv);
        if (FD_ISSET(STDIN_FILENO, &cpy_reads)) {
                FD_CLR(STDIN_FILENO, &cpy_reads);
                if (fgets(send_line, BUF_SIZE, stdin) != NULL) {
                    int i = strlen(send_line);
                    if (send_line[i - 1] == '\n') {
                        send_line[i - 1] = 0;
                    }
                    printf("input string: %s\n", send_line);
                }
            }

        if(errorNum == -1){
            perror("select()");
        }else if(errorNum){
            printf("Data is available now.\n");
        }else{
            printf("No data within five seconds.\n");
        }
    }
    return 0;
}

sudo gcc selectOutOfTimeWhile.c -o selectOutOfTimeWhile进行编译,sudo ./selectOutOfTimeWhile执行,之后可以看到若是没有输入内容的话,那么就会每隔5秒输出No data within five seconds.,最后按下Ctrl+c退出程序。

此文章为11月Day 14学习笔记,内容来源于极客时间《网络编程实战》

相关推荐
梁洪飞11 分钟前
noc 片上网络
linux·arm开发·嵌入式硬件·arm
欧洵.18 分钟前
从输入URL到页面展示:完整过程拆解
网络
沉默-_-34 分钟前
微信小程序网络请求 wx.request 详解
网络·学习·微信小程序·小程序
newsxun39 分钟前
从一条国道,到一个时代符号——申晨案例解析:如何打造公路文旅现象级IP「此生必驾318」
网络·网络协议·tcp/ip
Bruce_Liuxiaowei1 小时前
基于抓包分析的组播视频流故障排查与解决
网络·网络协议·wireshark·信号处理
wniuniu_1 小时前
增加依据。。
服务器·网络·数据库
KKKlucifer1 小时前
数据安全服务的技术深耕与场景适配:行业实践全景解析
网络·安全
2501_915909062 小时前
设置了 SSL Pinning 与双向 TLS 验证要怎么抓包
网络·网络协议·ios·小程序·uni-app·iphone·ssl
奔袭的算法工程师2 小时前
CRN源码详细解析(2)-- 图像骨干网络之Resnet18
网络·人工智能·深度学习·目标检测·自动驾驶
2502_911679142 小时前
KEYSIGHT是德 N1912A功率计:宽带多通道功率测量的标杆之选
大数据·网络·信息与通信·信号处理