首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux termios非规范read()超时不起作用

Linux termios是一个用于控制终端设备的API,它提供了一系列函数和数据结构,用于设置和修改终端的各种属性。其中,read()函数用于从终端设备读取数据。

在termios中,read()函数默认是阻塞的,即当没有数据可读时,read()函数会一直等待直到有数据到来。然而,有时候我们希望在一定时间内如果没有数据到来就立即返回,这就涉及到了read()函数的超时设置。

要实现read()函数的超时功能,可以通过设置终端设备的超时属性来实现。termios提供了一个名为"VTIME"的属性,用于设置读取数据的超时时间。VTIME的单位是0.1秒,因此设置VTIME为10表示超时时间为1秒。

具体的步骤如下:

  1. 使用tcgetattr()函数获取当前终端设备的属性。
  2. 修改属性中的c_cc[VTIME]字段为所需的超时时间,单位为0.1秒。
  3. 使用tcsetattr()函数将修改后的属性设置回终端设备。

以下是一个示例代码,演示如何设置read()函数的超时时间为1秒:

代码语言:txt
复制
#include <stdio.h>
#include <unistd.h>
#include <termios.h>

int main() {
    struct termios term;
    tcgetattr(STDIN_FILENO, &term);  // 获取终端属性

    term.c_cc[VTIME] = 10;  // 设置超时时间为1秒
    term.c_cc[VMIN] = 0;    // 设置最小读取字符数为0

    tcsetattr(STDIN_FILENO, TCSANOW, &term);  // 设置终端属性

    char buffer[256];
    int bytesRead = read(STDIN_FILENO, buffer, sizeof(buffer));  // 读取数据

    if (bytesRead > 0) {
        printf("Read %d bytes: %s\n", bytesRead, buffer);
    } else if (bytesRead == 0) {
        printf("Timeout: No data received.\n");
    } else {
        printf("Error: Failed to read data.\n");
    }

    return 0;
}

这段代码中,我们使用了tcgetattr()函数获取当前终端属性,并通过修改term结构体中的c_cc[VTIME]字段设置超时时间为1秒。然后,使用tcsetattr()函数将修改后的属性设置回终端设备。最后,使用read()函数读取数据,并根据返回值判断是否超时。

对于Linux termios非规范read()超时不起作用的问题,可能是由于终端设备的属性设置不正确导致的。可以尝试使用上述代码中的方法来设置超时属性,或者检查其他可能影响超时的因素,如串口配置、驱动程序等。

腾讯云提供了一系列云计算相关的产品,包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据具体需求和场景来选择,可以参考腾讯云官方网站(https://cloud.tencent.com/)获取更详细的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

linux阻塞与阻塞(connect连接超时)

After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET...,进一步来等待阻塞connect客户端与服务端建立完整地连接,在等待的过程中,如果阻塞connect建立成功了,客户端的sock_fd就会变成可写的(这个在本人的IO复用文章中介绍过,见下图) ④当阻塞...: 1.首先,阻塞的socket可能导致connect始终失败 2.其次,select对处于EINPROGRESS状态下的socket可能不起作用 3.最后,对于出错的socket,getsockopt...在有些系统(比如Linux)上返回-1,而在有些系统上(比如源自伯克利的UNIX)返回0 这些问题没有一个统一的解决办法 三、编码演示案例 #include #include <stdlib.h...sock_fd,F_SETFL,old_options); return sock_fd; } 测试① 我们使用程序去连接8888端口的服务器,但是服务器未开启,select等待10秒之后超时退出

6.2K10

【驱动】串口驱动分析(四)-串口编程和调试方法

MIN 和 TIME 在 termios 结构的 c_cc 成员的数组 下标名为 VMIN 和 VTIME 。MIN是指一次 read 调用期望返回的最小字节数 。...,则 read 返回 MIN 个字节,否则,在计时器超时后返回实际接收到的字节。...当 MIN = 0, TIME > 0 时TIME为允许等待的最大时间,计 时器在调用 read 时立即启动,在串口接到 1 字节数据或者计时器超时后即返回,如果是计时器超时,则返回 0 。...); //每次循环都要清空集合,否则不能检测描述符变化 FD_SET(fd, &fs_read); //添加描述符 // 超时等待读变化,>0:就绪描述字的正数目,...-1:出错, 0 :超时 fs_sel = select(fd + 1, &fs_read, NULL, NULL, &time); // printf("fs_sel = %d\n",

17910

linux uart应用开发(ttyS*设备)《Rice linux 学习开发》

linux使用串口的方法: 1.串口配置的头文件: #include /*POSIX 终端控制定义*/ 2.串口波特率的设置: 波特率B48004800B96009600B6750067500B115200115200...如果它是一行的第一个字符,那么用户程序的 read() 将返回 0,指示读到了 EOF。当设置ICANON 时可被识别,不再作为输入传递。 VMIN: canonical 模式读的最小字符数。...VTIME: canonical 模式读时的延时,以十分之一秒为单位。 VEOL2:(not in POSIX; 0, NUL) 另一个行尾字符。当设置 ICANON 时可被识别。...若在时间未到之前又读到了一个字符(但此时读到的总数仍不够VMIN)则计时重新开始(即每个字符都有VTIME*100ms的超时时间)。...; if((read_len = read(m_dev, data, datalen))>0) { return read_len; } else

3.2K10

Unix-Linux编程实践教程-chapter06-signal

终端驱动程序支持若干种处理控制函数,他们都通过发送信号到 进程来实现控制 信号是从内核发送给进程的一种简短消息.信号可能来自用户,其他进程,或 内核本身.进程可以告诉内核,在他收到信号时需要做出怎样的响应 终端模式: 1 规范模式...常见模式,驱动程序输入的字符保存在缓冲,接收到回车才发送到程序 2 规范模式 缓冲和编辑功能被关闭.stty -icanon 3 raw模式 每个处理步骤都被一个独立的位控制 由进程的某个操作产生的信号被称为同步信号...method: set tty into chr-by-chr mode and no-echo mode * set tty into no-delay mode * read...*/ { struct termios ttystate; tcgetattr(0, &ttystate); // read curr. setting ttystate.c_lflag...similar, but it is complicated */ { int termflags; termflags = fcntl(0, F_GETFL); // read

1.1K10

【驱动】串口驱动分析(三)-serial driver

unsigned int timeout:基于字符的超时时间。当字符被传输到UART端口时,如果在规定的时间内没有收到下一个字符,则会超时并发送通知。通常由驱动程序设置。...在Linux内核中,串口的驱动程序是分为两层实现的:串口芯片驱动程序和 serial core 层。...而超时时间则是指在 FIFO 中没有数据传输时,等待多长时间后自动清空 FIFO。超时时间的设置可以影响串口传输的稳定性和效率。...根据波特率和总共需要传输的位数,计算出超时时间。将总共需要传输的位数除以波特率,得到传输这些数据所需要的时间,再加上一些额外的时间(0.02 秒)作为缓冲,得到超时时间。...最后,将计算出来的超时时间赋值给端口结构体中的 timeout 成员变量,从而完成 FIFO 超时时间的设置。

16310

嵌入式Linux系列第7篇:操作UART

1 引言 串口是我们实际工作中经常使用的一个接口,比如我们在Linux下使用的debug串口,它用来登录Linux系统,输出log。...Linux内核配置,生成新的970uimage并烧写到板子里。...所谓阻塞和阻塞的含义如下: 阻塞: 对于read,指当串口输入缓存区没有数据的时候,read函数将会阻塞在这里,直到串口输入缓存区中有数据可读取,read读到了需要的字节数之后,返回值为读到的字节数;...阻塞: 对于read,指当串口输入缓冲区没有数据的时候,read函数立即返回,返回值为-1。...在打开串口文件时,打开模式加上O_NDELAY可以以阻塞方式打开串口;反之,不加上O_NDEAY,默认以阻塞方式打开串口。

3.1K20

18(终端IO)和19(伪终端)

终端IO有两种不同的工作模式: (1)规范模式输入处理。终端输入以行为单位进行处理 (2)规范模式输入处理。...这样也可以检测和修改各种终端选择标志和特殊字符,以使终端按照我们所希望的方式进行操作 #include int tcgetattr(int filedes, struct termios...如果slave_name空,那么slave设备的名称会被存放在其中,调用者需要为这个参数指向的指针分配空间。...如果指针slave_termios空,那么系统使用这个引用的结构来初始化slave的终端行规程。如果这个指针为空,那么系统设置slave的termios结构为系统定义的初始状态。...类似,如果slave_winsize指针空的时候,就用其引用的结构来初始化slave的窗口大小,如果这个指针为空,那么一般会将窗口大小的结构初始化为0。

1K30

python模块paramiko与ssh

paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。...stdout,stderr = ssh.exec_command(cmd) #           stdin.write("Y")   #简单交互,输入 ‘Y’         print stdout.read...stdout标准输出,在输出内容比较少时,可以通过直接使用read读取出所有的输出;但在输出内容比较多时,建议通过按行读取进行处理。不过按行读取时,每行结尾会有换行符n,这样输出的结果很不美观。...... try:     import termios     import tty     has_termios = True except ImportError:     has_termios...socket.timeout:                     pass             if sys.stdin in r:                 x = sys.stdin.read

1.4K10

fcntl系统调用

linux下串口的阻塞和阻塞操作  有两个可以进行控制串口阻塞性(同时控制read和write):一个是在打开串口的时候,open函数是否带O_NDELAY;第二个是可以在打开串口之后通过fcntl(...阻塞的定义:  对于read,block指当串口输入缓冲区没有数据的时候,read函数将会阻塞在这里,移植到串口输入缓冲区中有数据可读取,read读到了需要的字节数之后,返回值为读到的字节数; 对于...阻塞的定义: 对于read,no block指当串口输入缓冲区没有数据的时候,read函数立即返回,返回值为0。...static int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop) { struct termios...newtio; struct termios oldtio; if(tcgetattr(fd,&oldtio) !

1.4K30

Linux-485收发切换延迟的解决方法

但在Linux应用程序编写中,这个方向切换存在延迟问题。...知识储备 解决此问题,需要有如下知识储备: 了解485通信原理 了解Linux终端设备驱动架构,搞清楚板上串口对应的实际驱动源文件 掌握Linux设备驱动中的中断处理机制:顶半部、底半部(tasklet...= tty->termios; baud = uart_get_baud_rate(port, &termios, NULL, 1200, 115200); bit_width =...应用程序串口接收的read()函数一直处于阻塞状态,直到数据在信号线中传输完毕驱动层中有数据可读。...优化方向是:由驱动层接收在接收起始时刻和结束时刻分别向应用层发一个信号,结束时刻定在串口接收超时中断时刻,这样应用程序可以获知串口线何时处于接收忙碌状态。

7.5K30

python paramiko

stderr =  ssh.exec_command(cmd)  #            stdin.write("Y")   #简单交互,输入 ‘Y’          print stdout.read...stdout标准输出,在输出内容比较少时,可以通过直接使用read读取出所有的输出;但在输出内容比较多时,建议通过按行读取进行处理。不过按行读取时,每行结尾会有换行符\n,这样输出的结果很不美观。...try:      import termios      import tty      has_termios = True  except ImportError:      has_termios...port,username=username,password=password) stdin,stdout,stderr=ssh.exec_command('ls /') print stdout.read...hostname,连接目标的主机地址 port,连接目标的端口,默认22 username,用户名 password,用户密码 pkey,私钥方式用户验证 key_filename,私钥文件名 timeout,超时时间

1.4K10
领券