zoukankan      html  css  js  c++  java
  • Linux 套接字编程

    select 可以感知文件表述符集合中的变化,如果办fd0(即标准输入)放入select的read fd set,发现只有按回车的时候select才会返回。查了下要把终端的缓冲大小设为1,这样就能实现击键后马上反应了。

    #include <stdio.h>
    #include <stdlib.h>
    
    #include <unistd.h>
    #include <errno.h>
    #include <termio.h>
    
    #include <sys/time.h>
    #include <sys/types.h>
    
    #define BUF_SIZE 256
    
    void setup_terminal(struct termios* old_args);
    
    void reset_terminal(struct termios* old_args);
    
    int main() {
            struct termios old_args;
    
            setup_terminal(&old_args);
    
            fd_set rfds;
            int sres = 0;
    
            char buffer[BUF_SIZE];
            int nread = 0;
    
            for (;;) {
                    /* reset read file descriptor set */
                    FD_ZERO(&rfds);
                    /* add standard input file descriptor to the set */
                    FD_SET(0, &rfds);
    
                    /* do blocking select */
                    printf("
    select begin
    ");
                    sres = select(0 + 1, &rfds, NULL, NULL, NULL);
                    printf("
    select return
    ");
    
                    if (sres < 0) {
                            perror("select error");
                            break;
                    } else if (sres == 0) {
                            /* should not be here for blocked select without timeout*/
                            printf("select timeout
    ");
                    } else {
                            if (FD_ISSET(0, &rfds)) {
                                    nread = read(0, buffer, sizeof(buffer)-1);
                                    if (nread <= 0) {
                                            perror("read error");
                                            break;
                                    }
                                    buffer[nread] = '';
                                    printf("read string(%d): %s
    ", nread, buffer);
                            }
                    }
    
            }
            reset_terminal(&old_args);
            return 0;
    }
    
    void setup_terminal(struct termios* old_args) {
            tcgetattr(0, old_args);
    
            struct termios new_args = *old_args;
            new_args.c_lflag &= ~ICANON;
            new_args.c_cc[VMIN] = 1;
    
            tcsetattr(0, TCSANOW, &new_args);
    }
    
    void reset_terminal(struct termios* old_args) {
            tcsetattr(0, TCSANOW, old_args);
    }

    记得很早之前也一致想实现这个功能,终于如愿,虽然和socket编程没什么太大关系。

    参考:

    http://tieba.baidu.com/p/685575698

  • 相关阅读:
    根据访问ip的地区跳转到指定地址
    js生成vCard,以及格式参数详细说明
    min_to_split_multiprocessing多进程,用于平时快速补充数据
    min_to_split.py按日存储到按个股存储
    readzip_minute_data 多进程处理数据
    打包成7zfile,to7zfile
    baostock_multiprocessing 多进程取数据
    终止阻塞线程(有共享锁的线程无效)
    readzip_add_maxL3多线程
    readzip_add_maxL2
  • 原文地址:https://www.cnblogs.com/lailailai/p/3917723.html
Copyright © 2011-2022 走看看