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

相关推荐
热爱嵌入式的小许2 小时前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
小堃学编程2 小时前
计算机网络(十) —— IP协议详解,理解运营商和全球网络
网络·tcp/ip·计算机网络
IPFoxy6665 小时前
探索路由器静态IP的获取方式
网络·智能路由器
menge23335 小时前
VLAN:虚拟局域网
网络·智能路由器
ZachOn1y6 小时前
计算机网络:计算机网络概述 —— 初识计算机网络
网络·计算机网络·知识点汇总·考研必备
三金121386 小时前
SpringIoC容器的初识
网络·网络协议·rpc
韩楚风6 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学6 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO6 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu77 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器