poll+stdin测试+fileno

文章展示了如何使用poll函数来监控标准输入(STDIN_FILENO)的可读事件。在测试2和3中,程序初始化一个pollfd结构体,设置文件描述符和期望事件,然后调用poll函数等待输入。当有输入时,程序读取数据并打印。测试3中,通过fileno函数获取stdin的文件描述符。程序持续运行,直到接收到特定长度的数据后退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

poll函数原型

#include <poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

struct pollfd {
    int   fd;         /* file descriptor */
    short events;     /* requested events */
    short revents;    /* returned events */
};

测试1:读取输入的例子:

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <string.h>
#include <poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

#define DEBUG_INFO(format, ...) printf("%s - %d - %s :: "format"\n",__FILE__,__LINE__,__func__ ,##__VA_ARGS__)

#define MAX_FD_COUNT  1
 
int main(void){
    char buf[200];
    memset(buf,0,sizeof(buf));
    FILE* file = fdopen(0,"r");
    int len = fscanf(file,"%s",buf);
    DEBUG_INFO("len = %d,buf = %s",len,buf);    
    return 0;
}

测试2:poll+STDIN_POLL

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

#define DEBUG_INFO(format, ...) printf("%s - %d - %s :: "format"\n",__FILE__,__LINE__,__func__ ,##__VA_ARGS__)

#define MAX_FD_COUNT  1
 
int main(void){
    char buf[BUFSIZ];
    struct pollfd fds[1];
    memset(buf,0,sizeof(buf));

    DEBUG_INFO("%d,%d,%d",STDIN_FILENO, STDOUT_FILENO,STDERR_FILENO);
    fds[0].fd = STDIN_FILENO;
    fds[0].events = POLLIN;
    int ret = 0;
    while(1){
        ret = poll(fds,1,30000);
        if(ret == -1){
            perror("error");
            exit(-1);
        }
        if(fds[0].revents & POLLIN){
            int len = read(STDIN_FILENO,buf,sizeof(buf));
            DEBUG_INFO("len = %d,buf = %s",len,buf);
            if(len == 1){
                break;
            }
        }
    }
    DEBUG_INFO("bye bye");
    return 0;
}

测试3:poll+函数fileno+stdin

#include <stdio.h>
int fileno(FILE *stream);

测试代码:

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

#define DEBUG_INFO(format, ...) printf("%s - %d - %s :: "format"\n",__FILE__,__LINE__,__func__ ,##__VA_ARGS__)

#define MAX_FD_COUNT  1
 
int main(void){
    char buf[BUFSIZ];
    struct pollfd fds[1];
    memset(buf,0,sizeof(buf));

    int fd = fileno(stdin);
    DEBUG_INFO("fd = %d",fd);
    fds[0].fd = fd;
    fds[0].events = POLLIN;
    int ret = 0;
    while(1){
        ret = poll(fds,1,30000);
        if(ret == -1){
            perror("error");
            exit(-1);
        }
        if(fds[0].revents & POLLIN){
            int len = read(fd,buf,sizeof(buf));
            DEBUG_INFO("len = %d,buf = %s",len,buf);
            if(len == 1){
                break;
            }
        }
    }
    DEBUG_INFO("bye bye");
    return 0;
}

测试及结果:

/big/work/ipc/poll_mkstemp.c - 19 - main :: fd = 0
123456
/big/work/ipc/poll_mkstemp.c - 31 - main :: len = 7,buf = 123456

^C
real    0m7.472s
user    0m0.001s
sys     0m0.000s

小结

鸡肋还是积累。大梦谁先觉,平生我自知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值