Wolf_cgl 2016-06-24 06:41 采纳率: 0%
浏览 1265

关于select函数的一些疑问

想做一个监控文件的小功能,文件是FIFO类型,可能被写入0或者1,我要做的就是监控这个文件,如果被更新了就把值读出来。
  用到select函数,但出现一些不太好理解的现象。

  1. 每次select之前,好像都需要设置一下timeout时间,比如下面程序如果把时间设置放在while前,那么将会狂打印"once"。
  2. 程序执行时,一开始“once"的打印差不多1s一次。在另一个终端输入:echo -n 0 > has_sd_card 之后,“once"有事疯狂打印了,timeout设置失效了?还是说我的echo -n 0 > has_sd_card导致stdin可读了,但是已经被重定向到文件了,没想明白。

  求解答

程序源码如下:

 // Linux include
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/time.h>

#include <stdio.h>
#include <iostream>

int main()
{
    int mdevFd = -1;
    mdevFd = open("has_sd_card", O_RDONLY|O_NONBLOCK);
    if (mdevFd < 0) {
        std::cout << "Open file failed." << std::endl;
        return -1;
    }
    std::cout << mdevFd << std::endl;

    int ret;
    char value;
    fd_set rd;
    struct timeval tv;

    while (true) {
        FD_ZERO(&rd);
        FD_SET(mdevFd, &rd);
        tv.tv_sec   = 0;
        tv.tv_usec  = 1000000;    /* timeout 1000 ms */
        std::cout << "1" << std::endl;
        ret = select(mdevFd + 1, &rd, NULL, NULL, &tv);
        std::cout << "2" << std::endl;
        if (ret > 0 && read(mdevFd, &value, sizeof(char)) > 0) {
            std::cout << "File updated, value = " << value << std::endl;
        }
        std::cout << "once" << std::endl;
    }

    close(mdevFd);
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 风雨同舟- 2016-06-27 09:28
    关注

    select会不断改变timeout设置的参数,到超时时间时,该值也变成了0,所以必须在while循环里每次重新设置,
    pselect不会改变timeout参数

    评论

报告相同问题?

悬赏问题

  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。