fd

select函数

倾然丶 夕夏残阳落幕 提交于 2020-01-29 02:55:29
select函数 select()函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生 或经历一段指定时间后才唤醒它 #include <sys/select.h> #include <sys/time.h> // 返回值:若有就绪描述符,则返回就绪描述符数目;若超时则返回0,出错返回-1 int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); select的参数: maxfdp1: 指定待测试的描述符个数,它的值是待测试的最大描述符加1 readset、writeset、exceptset: 指定让内核测试读、写、异常条件的描述符 异常条件: 某个套接字的带外数据到达 某个已置为分组模式的伪终端存在可以从其主端读取的控制状态信息 fd_set *: select使用的描述符集 系统提供了4个宏对描述符集进行操作: #include <sys/select.h> #include <sys/time.h> void FD_SET(int fd, fd_set *fdset); // 设置文件描述符集fdset中对应于文件描述符fd的位(设置为1) void FD_CLR(int fd, fd

2018-2019-1 20165307 20165327 20165332 实验五 通讯协议设计

谁说胖子不能爱 提交于 2020-01-29 01:46:54
2018-2019-1 20165307 20165327 20165332 实验五 通讯协议设计 Linux下OpenSSL的安装与使用 1.两人一组 2.基于Socket实现TCP通信,一人实现服务器,一人实现客户端 3.研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5 4.选用合适的算法,基于混合密码系统实现对TCP通信进行机密性、完整性保护。 实验步骤 在OpenSSL下载地址下载OpenSSL 解压OpenSSL源代码 tar xzvf openssl-1.1.0j.tar.gz 进入源代码目录后 $ ./config $ make $ make test $ make install 编写测试代码 test_openssl.c #include <stdio.h> #include <openssl/evp.h> int main(){ OpenSSL_add_all_algorithms(); return 0; } 编译和执行 结果打印0则表示安装成功 实现TCP通信 server.c: #include<stdlib.h> #include<pthread.h> #include<sys/socket.h> #include<sys/types.h> //pthread_t , pthread_attr_t and so

组播

天大地大妈咪最大 提交于 2020-01-29 01:06:05
组播 单播只能发给一个接收方,广播发给所有主机,但过多的广播会大量占用网络带宽,造成网络风暴,影响通信。 组播(多播)为折中方式,只有加入某个多播组的主机才能收到数据。 组播的IP地址:224.0.0.1 ~ 239.255.255.254(中间除去广播地址) 组播的发送 1)创建UDP套接字 2)指定目标地址与端口 3)发送数据包 1 /*udp demo */ 2 3 /* usage: 4 * ./client serv_ip serv_port 5 */ 6 #include "net.h" 7 void usage (char *s) 8 { 9 printf ("\nThis is multicast demo!\n"); 10 printf ("\nUsage:\n\t %s serv_ip serv_port", s); 11 printf ("\n\t serv_ip: udp server ip address(between 224~239 segment)"); 12 printf ("\n\t serv_port: udp server port(serv_port > 5000)\n\n"); 13 } 14 15 int main (int argc, char *argv[]) 16 { 17 int fd = -1; 18 int port =

Linux串口

隐身守侯 提交于 2020-01-28 09:17:59
可以参考 http://www.cnblogs.com/lovemo1314/archive/2010/10/29/1864327.html 《从实践中学嵌入式linux应用程序开发》(华清远见嵌入式学院)第2章、嵌入式文件和I/O编程 设置串口属性的基本流程: 保存原先串口配置 使用tcgetattr(fd,&old_cfg)函数,该函数得到有fd指向的终端的配置参数,并将它们保存于termios结构变量old_cfg中。若调试成功,函数返回值为0,若调试失败,函数返回值为-1; if(tcgetattr(fd,&old_cfg != 0 ) { perror("tcgetattr"); return -1; } 若调试成功,函数返回值为0,若调试失败,函数返回值为-1; 激活选项 CLOCAL和CREAD分别用于本地连接和接收使能,因此首先要通过位掩码的方式激活这两个选项。 newtio.c_cflag |= CLOCAL | CREAD; 调用cfmakeraw()函数可以将终端设置为原始模式,在后面的实例中,采用原始模式进行串口数据通信。 cfmakeraw(&new_cfg); 设置波特率 cfsetispeed(&new_cfg,B115200); cfsetospeed(&new_cfg,B115200); 设置字符大小 new_cfg.c_cflag &=

V4L2编程初体验

有些话、适合烂在心里 提交于 2020-01-28 08:20:10
内容摘要: Video for Linux two(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video2下。 最近想做智能机器人,想加上视频采集这个模块,于是对linux下的视频方面的编程产生了兴趣,首先从入门开始吧! 一、Video for Linux Tow 在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文件是/dev/v4l/video0。为了通用,可以建立一个到/dev/video0的链接。V4L2支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。V4L2在include/linux/videodev.h文件中定义了一些重要的数据结构,在采集图像的过程中,就是通过对这些数据的操作来获得最终的图像数据。Linux系统V4L2的能力可在Linux内核编译阶段配置,默认情况下都有此开发接口。V4L2从Linux 2.5.x版本的内核中开始出现。

高并发多路IO之select,poll和epoll模型区别与代码实现

≡放荡痞女 提交于 2020-01-28 07:53:34
多路IO之select 优点:单进程下支持高并发,可以跨平台 缺点:多次从内核到应用,应用到内核的数组拷贝;    每次内核都会重置填写的数据    最大支持1024客户端,原因在于fd_set定义使用了FD_SETSIZE,大小为1024; 以下是select模型server代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include <errno.h> #include <fcntl.h> #include <sys/select.h> #include <ctype.h> int main(){ int lfd = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in serv; bzero(&serv,sizeof(serv)); serv.sin_port = htons(8888); serv.sin_family = AF_INET; serv.sin_addr.s_addr

致敬70—我爱你中国

旧城冷巷雨未停 提交于 2020-01-28 06:15:47
国旗,星星,70,i,♥,u 一个简单的图画致敬70 import turtle as t def picture ( x1 , y1 , x , y ) : t . up ( ) t . goto ( x1 , y1 ) t . down ( ) t . begin_fill ( ) t . fillcolor ( "yellow" ) for i in range ( 5 ) : t . fd ( x ) t . left ( y ) t . end_fill ( ) t . speed ( 10 ) t . bgcolor ( "red" ) t . color ( "yellow" ) t . speed ( 10 ) picture ( - 650 , 230 , 100 , 144 ) picture ( - 431 , 290 , 60 , 144 ) picture ( - 430 , 181 , 60 , 144 ) picture ( - 500 , 81 , 60 , 144 ) picture ( - 610 , 65 , 60 , 144 ) t . speed ( 10 ) t . pencolor ( "gold" ) t . pensize ( 25 ) t . pu ( ) t . goto ( 10 , 10 ) t . pd ( ) t .

linux与开发板串口通信

可紊 提交于 2020-01-27 21:46:15
研究了一天的linux串口,结果改了树莓派的系统配置文件config.txt给改了导致系统崩溃。。。。其实我感觉网上的大多数方法都是不符合新版本树莓派的,网上的方法是通过修改系统配置文件后安装minicom进行串口的调试。为什么需要修改配置文件?因为树莓派升级后tx与rx引脚是复用的,需要用于串口的话就需要修改配置,让系统把io口让给串口。 这种方法比较麻烦,我采用的是利用两个usb转串口,互相连接好了,就可以直接通过linux下的串口通信函数来实现通信了。需要注意的是两个usb转串口相互连接时不仅仅要将RXD、TXD相互反接,还需要将GND连接在一起。 下面讲解下具体方法 (1)不同系统的串口名称是不一样的,如下图。 (2)设置 最基本的设置串口包括波特率设置,效验位和停止位设置. 很多系统都支持POSIX终端(串口)接口.程序可以利用这个接口来改变终端的参数,比如,波特率,字符大小等等.要使用这个端口的话,你必须将<termios.h>头文件包含到你的程序中.这个头文件中定义了终端控制结构体和POSIX控制函数. 与串口操作相关的最重要的两个POSIX函数可能就是tcgetattr(3)和tcsetattr(3).顾名思义,这两个函数分别用来取得设设置终端的属性.调用这两个函数的时候,你需要提供一个包含着所有串口选项的termios结构体,串口的设置主要是设置struct

v4L2编程

喜夏-厌秋 提交于 2020-01-27 04:00:33
v4L2编程 v4L2是针对uvc免驱usb设备的编程框架,主要用于采集usb摄像头等,编程模式如下: 一.设置采集方式 打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。这一步是可选的。在Linux编程中,一般使用ioctl函数来对设备的I/O通道进行管理: extern int ioctl (int __fd, unsigned long int __request, …) __THROW; __fd:设备的ID,例如刚才用open函数打开视频通道后返回的cameraFd; __request:具体的命令标志符。 在进行V4L2开发中,一般会用到以下的命令标志符: VIDIOC_REQBUFS:分配内存 VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址 VIDIOC_QUERYCAP:查询驱动功能 VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式 VIDIOC_S_FMT:设置当前驱动的频捕获格式 VIDIOC_G_FMT:读取当前驱动的频捕获格式 VIDIOC_TRY_FMT:验证当前驱动的显示格式 VIDIOC_CROPCAP:查询驱动的修剪能力 VIDIOC_S_CROP:设置视频信号的边框 VIDIOC_G_CROP:读取视频信号的边框 VIDIOC_QBUF:把数据从缓存中读取出来 VIDIOC

IO多路复用之epoll总结

最后都变了- 提交于 2020-01-27 03:05:52
除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #define STDIN 0 // file descriptor for standard input int main(void) { struct timeval tv; fd_set readfds; tv.tv_sec = 2; tv.tv_usec = 500000; FD_ZERO(&readfds); FD_SET(STDIN, &readfds); // don't care about writefds and exceptfds: select(STDIN+1, &readfds, NULL, NULL, &tv); if (FD_ISSET(STDIN, &readfds)) printf("A key was pressed!\n"); else printf("Timed out.\n"); return 0; } select、poll、epoll之间的区别总结[整理] select,poll