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

相关推荐
爱瑞瑞1 小时前
🐧深入浅出的认识 Linux 指令
linux·shell
freyazzr1 小时前
TCP/IP 网络编程 | Reactor事件处理模式
开发语言·网络·c++·网络协议·tcp/ip
ajassi20001 小时前
开源 java android app 开发(十一)调试、发布
android·java·linux·开源
AI风老师1 小时前
通信网络基础概念
开发语言·网络·php
小李飞刀李寻欢1 小时前
使用kubeadm部署Kubernetes(k8s)集群的步骤
linux·服务器·ubuntu·kubernetes·k8s
运维成长记2 小时前
阿里云实践创建实例步骤
linux·运维·服务器·阿里云·云计算
边啵儿2 小时前
如何确定某个路由器的路由表?(计算机网络)
网络·计算机网络
THe CHallEnge of THe BrAve2 小时前
Linux检验库是否安装成功
linux·运维·服务器
勤奋的小王同学~2 小时前
(功能测试Charles)如何抓取手机http的报文
网络·网络协议·http
chao_7892 小时前
HTTP 响应状态码
网络·网络协议·http