FD_ZERO(&fs_read); FD_SET(fd,&fs_read); 什么意思
时间: 2024-04-26 08:25:06 浏览: 176
这是一段使用select函数进行I/O多路复用的代码,其中:
- FD_ZERO(&fs_read):将fs_read集合清空,即清空文件描述符集合。
- FD_SET(fd, &fs_read):将文件描述符fd添加到fs_read集合中,表示需要对该文件描述符进行读操作。
通过使用select函数,可以让程序同时监听多个文件描述符,一旦有文件描述符准备就绪,就可以进行相应的读写操作,从而提高程序的效率。
相关问题
FD_ZERO(&fs_read); FD_SET(fd,&fs_read);
这段代码是什么意思?
这段代码是在使用select函数时设置监视文件描述符集合的操作。其中FD_ZERO(&fs_read)用于将fs_read清零,FD_SET(fd,&fs_read)用于向fs_read中添加fd文件描述符,从而告诉select函数需要监视该文件描述符的读操作。这样,当该文件描述符可读时,select函数就会返回。
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 }
这是一个从串口中读取数据的函数,该函数的参数包括串口文件描述符fd、接收缓存区rcv_buf、数据长度data_len和超时时间mstimeout。该函数首先使用select函数进行等待,等待串口上有数据可读或者超时,如果有数据可读,就使用read函数从串口中读取数据,将读取到的数据保存到接收缓存区中,并返回读取到的数据长度。如果等待超时或者读取失败,就返回0。该函数使用了两个条件编译的方式,可以根据需要选择使用哪一部分代码。
阅读全文