主题 : 请教led-player的一个问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 60244
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2011-12-07
最后登录: 2019-06-17
楼主  发表于: 2012-04-05 11:06

 请教led-player的一个问题

led-player里main的一段程序,这个for死循环是怎么跳出来的?或者要弄明白这个管道的东西看什么资料容易理解,是怎么工作的?

求google的关键词。

for (;;) {
        fd_set rds;
        struct timeval step;
        int ret;

        FD_ZERO(&rds);
        FD_SET(led_control_pipe, &rds);
        step.tv_sec  = period;
        step.tv_usec = (period - step.tv_sec) * 1000000L;

        ret = select(led_control_pipe + 1, &rds, NULL, NULL, &step);
        if (ret < 0) {
            perror("select");
            exit(1);
        }
        if (ret == 0) {
            push_leds();
        } else if (FD_ISSET(led_control_pipe, &rds)) {
            static char buffer[200];
            for (;;) {
                char c;
                int len = strlen(buffer);
                if (len >= sizeof buffer - 1) {
                    memset(buffer, 0, sizeof buffer);
                    break;
                }
                if (read(led_control_pipe, &c, 1) != 1) {
                    break;
                }
                if (c == '\r') {
                    continue;
                }
                if (c == '\n') {
                    int tmp_type;
                    double tmp_period;
                    if (sscanf(buffer,"%d%lf", &tmp_type, &tmp_period) == 2) {
                        type = tmp_type;
                        period = tmp_period;
                    }
                    fprintf(stderr, "type is %d, period is %lf\n", type, period);
                    memset(buffer, 0, sizeof buffer);
                    break;
                }
                buffer[len] = c;
            }
        }
    }
级别: 新手上路
UID: 60244
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2011-12-07
最后登录: 2019-06-17
1楼  发表于: 2012-04-09 12:30
求关注