使用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学习笔记,内容来源于极客时间《网络编程实战》。

相关推荐
吴建旭 智宅焕9 小时前
智能家居全国交付中执行端能力跃迁的架构设计:从标准装调到交付专家的系统化路径
网络·网络协议·智能家居
lzx_00211 小时前
Linux 进程(三) 从进程状态到僵尸进程、孤儿进程
linux·服务器
Eyfcom12 小时前
〖全球化架构 05〗跨国网络专线优化:QUIC 协议与 SD-WAN 在跨境传输中的实战
网络·架构·跨境物流快递系统·全球化架构
FlightYe12 小时前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
Dream Cosmos13 小时前
传输层协议之UDP
网络·网络协议·udp
刘马想放假13 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
kloc14 小时前
聊天室项目入口网关子服务的实现
linux·c++
GeW14 小时前
深圳APEC峰会倒计时:数据库与Linux运维的"隐形考场"
linux
梦到啥说啥15 小时前
Linux网络编程:UDP网络协议
linux·网络协议·udp
鸿蒙开发爱好者16 小时前
下班后做的小工具和小游戏,我把它们整理成了 WyanHub
网络·人工智能·职场和发展·个人开发