fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
时间: 2024-04-07 21:31:25 浏览: 19
这段代码调用了 `select()` 函数,它的参数含义如下:
- `fd+1`:最大文件描述符值加一,表示要监视的文件描述符的范围是从 0 到 `fd`。
- `&fs_read`:指向 fd_set 类型的指针,表示要监视可读事件的文件描述符的集合。在 `select()` 函数返回时,该集合中会包含有可读事件发生的文件描述符。
- `NULL`:指向 fd_set 类型的指针,表示要监视可写事件的文件描述符的集合。在本例中,我们不关心可写事件,因此设置为 `NULL`。
- `NULL`:指向 fd_set 类型的指针,表示要监视异常事件的文件描述符的集合。在本例中,我们不关心异常事件,因此设置为 `NULL`。
- `&time`:指向 timeval 结构体的指针,表示 `select()` 函数的超时时间。如果在超时时间内没有任何事件发生,`select()` 函数会返回 0。如果设置为 `NULL`,则 `select()` 函数将一直等待,直到有事件发生。
`select()` 函数的返回值是就绪文件描述符的个数。在本例中,它将返回发生可读事件的文件描述符的个数,存储在 `fs_sel` 变量中。
相关问题
fs_sel = select(fd+1,&fs_read,NULL,NULL,&time); 函数原型
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
其中,nfds 是需要检查的文件描述符数量加 1;readfds、writefds 和 exceptfds 分别是需要检查读、写和异常情况的文件描述符集合,如果不需要检查,就传入 NULL;timeout 是超时时间,如果不需要超时限制,就传入 NULL。函数返回值为就绪文件描述符的数量,如果超时时间到达,返回值为 0,如果出错,返回值为 -1。
int read_datas_tty(int fd, char *rcv_buf,int data_len,int mstimeout) { int len,fs_sel; fd_set fs_read; struct timeval time; memset(rcv_buf,0,sizeof(rcv_buf)); #if 1 FD_ZERO(&fs_read); FD_SET(fd,&fs_read); time.tv_sec = mstimeout/1000; time.tv_usec = (mstimeout%1000)*1000; fs_sel = select(fd+1,&fs_read,NULL,NULL,&time); if(fs_sel) { len = read(fd,rcv_buf,data_len); if(len == 0) return 0; ///printf("%s:%d recv buff[len = %d] is %s \r\n",__FUNCTION__,__LINE__,len,rcv_buf); ///print_payload(rcv_buf,len); return len; } else { //printf("failed [%s : %d]\r\n",__FUNCTION__,__LINE__); return 0; } #endif #if 0 printf("%s:%d \r\n",__FUNCTION__,__LINE__); len = read(fd,rcv_buf,data_len); if(len > 0) { printf("%s:%d recv buff[len = %d] is %s \r\n",__FUNCTION__,__LINE__,len,rcv_buf); print_payload(rcv_buf,len); return len; } else{ printf("failed [%s : %d]\r\n",__FUNCTION__,__LINE__); return 0; } #endif }
这是一个函数,函数名为read_datas_tty,它的作用是从指定的文件描述符fd中读取数据,数据长度为data_len,并且在指定的时间内等待数据到达。如果成功读取到数据,则将数据存储在rcv_buf中,返回值为实际读取的数据长度。如果在等待时间内没有读取到数据,则返回0。
该函数使用了select函数来等待数据到达,如果在指定时间内有数据到达,则执行read函数读取数据。如果select返回0,则表示在指定时间内没有数据到达,函数返回0。该函数还包含一些注释和调试代码,可以通过定义#if 1或#if 0来选择是否启用。