Linux网络编程----fcntl和select

linux 网络编程总结
linux网络编程中两个重要的高级编程函数:fcntl和select
函数原型如下:
1、int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);
2、
int fcntl(int fd , int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock * lock);
 
    函数1:select
    是为了支持网络中多IO机制,也就是所说的并发处理,n是进程创建的最大文件描述符+1,参数readfds、writefds 和exceptfds 称为描述词组,表示文件描述符的各种状态;timeout超时时间值,如果在轮询中超过时间,将检测另一个描述符,一般情况下,select还与下面一些函数共同使用,来检测各个文件描述符的状态改变:
 FD_ZERO(fd_set *fdset):清空fdset与所有文件描述符的联系。
 FD_SET(int fd, fd_set *fdset):建立文件描述符fd与fdset的联系。
 FD_CLR(int fd, fd_set *fdset):清除文件描述符fd与fdset的联系。
 FD_ISSET(int fd, fd_set *fdset):检查fd_set联系的文件描述符fd是否可读写,>0表示可读写。
    返回值:如果为0,则表示说明在设定的时间内,socket的状态没有发生变化。
            如果-1,这说明select函数出错;
            如果其他情况,表明执行成功,检测到文件描述符状态变化。

    函数2:fcntl
    功能:用来操作文件描述词的一些特性。
    参数说明:参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令。
    返回值:成功,返回0,失败,返回-1
    例子:下面表示设置套接字描述符sockfd的状态为非阻塞
	fcntl( sockfd, F_SETFL, O_NONBLOCK); 
	// sockfd 是要改变状态的文件描述符. 
	// F_SETFL 表明要改变文件描述符的状态 
	// O_NONBLOCK 表示将文件描述符变为非阻塞的. 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux中进行RS485-RTU通讯编程,需要使用串口通信库和RS485驱动程序。以下是一个简单的例子,展示了如何使用C语言编写一个基于RS485-RTU通讯的程序。 步骤1:打开串口 首先,需要使用串口通信库打开串口,并配置相应的属性,如波特率、数据位、停止位等。 ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <termios.h> #include <unistd.h> int open_serial_port(const char* portname, speed_t baudrate) { int fd = open(portname, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("open_serial_port: Unable to open port"); return -1; } // Configure the port struct termios options; tcgetattr(fd, &options); cfsetispeed(&options, baudrate); cfsetospeed(&options, baudrate); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_iflag &= ~(IXON | IXOFF | IXANY); options.c_oflag &= ~OPOST; options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 100; // 10 second timeout tcsetattr(fd, TCSANOW, &options); return fd; } ``` 步骤2:配置RS485驱动程序 接下来,需要配置RS485驱动程序,以便能够进行RS485-RTU通讯。在Linux中,可以使用ioctl()函数来设置驱动程序的属性。以下是一个设置RS485驱动程序为RTS/CTS流控制的例子: ```c #include <sys/ioctl.h> int set_rs485_mode(int fd, int mode) { int status; if (ioctl(fd, TIOCMGET, &status) == -1) { perror("set_rs485_mode: Unable to get status"); return -1; } if (mode == 1) { status |= TIOCM_RTS; } else { status &= ~TIOCM_RTS; } if (ioctl(fd, TIOCMSET, &status) == -1) { perror("set_rs485_mode: Unable to set mode"); return -1; } return 0; } ``` 步骤3:发送和接收数据 最后,需要编写发送和接收数据的代码。在RS485-RTU通讯中,需要使用Modbus协议来进行通讯。以下是一个发送和接收Modbus数据的例子: ```c #include <string.h> #include <errno.h> int send_modbus_data(int fd, const char* data, int len) { if (set_rs485_mode(fd, 1) == -1) { return -1; } if (write(fd, data, len) != len) { perror("send_modbus_data: Unable to write data"); return -1; } if (set_rs485_mode(fd, 0) == -1) { return -1; } return 0; } int receive_modbus_data(int fd, char* buffer, int len) { if (set_rs485_mode(fd, 0) == -1) { return -1; } int nbytes = read(fd, buffer, len); if (nbytes == -1) { perror("receive_modbus_data: Unable to read data"); return -1; } return nbytes; } ``` 这些是基本的RS485-RTU通讯编程步骤。当然,实际的应用中,还需要根据具体的需求进行相应的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值