fd

Too many open files error

醉酒当歌 提交于 2020-02-20 01:27:21
在linux服务端环境中经常会出现 "too many open files" 的错误,该错误产生的原因是file descriptors(fd)打开过多,超过了linux对单个process的最大限制。那么如何解决呢,主要从两个角度考虑,第一个是进程的确需要更多的fd,这时需要调整fd的最大数量,这里需要调整的数量有两个Hard limit 和Soft limit,另外就是检测程序中是否又fd在open之后没有关闭。 这个需要解释几个概念: File Descriptors : 文件描述符,在Unix系列操作系统中的概念,和Windows的File handle(文件句柄)比较像,但是有着本质的不同。Unix操作系统中一切皆为File,比如设备都是文件方式来处理,这与windows有很大的不同。 文件描述不仅包括对文件的处理,还包括Socket,NamePipe,Character device(字符设备,比如键盘等),Block device(阻塞设备,比如光驱,硬盘等) 等 Hard limit: 硬限制,顾名思义强硬的限制,这里是指超级管理员对fd的最大数量的硬性限制,也就是说非root用户只能使用低于这个数量的fd。 Soft limit: 软限制,是对非root用的fd数量限制,在这里如果soft limit没有超过 hard limit

IO 多路转接 epoll

☆樱花仙子☆ 提交于 2020-02-20 01:15:28
read 函数返回值 >0 :实际读到的字节数 =0 :socket中,表示对端关闭 close() -1 : 如果errno = EINTR 被异常中断。需要重启。 如果errno =EAGIN 或 EWOULDBLOCK 以非阻塞的方式读数据,但是没有数据。需要再次读 如果errno = ECONNRESET 说明连接被重置。需要close()。 移除监听队列 错误 突破 1024 文件描述符限制 cat /proc/sys/fs/file-max 当前计算机能打开的最大文件个数。受硬件影响 ulimit -a -->当前用户下的进程。默认打开文件件描述符个数 缺省 为 1024 修改: 打开 sudo vi /etc/security/limits.conf 写入 * soft nofile 65536 -->设置默认值 可以直接借助命令修改【注销用户 使其生效】 * hard nofile 100000 --》命令修改上限 命令修改: ulimit -n 21000 突破 1024 文件描述符限制 cat /proc/sys/fs/file-max 当前计算机能打开的最大文件个数。受硬件影响 ulimit -a -->当前用户下的进程。默认打开文件件描述符个数 缺省 为 1024 修改: 打开 sudo vi /etc/security/limits.conf 写入 *

初识linux内核漏洞利用

梦想与她 提交于 2020-02-19 01:55:23
0x00 简介 之前只接触过应用层的漏洞利用, 这次第一次接触到内核层次的,小结一下。 0x01 概况 这次接触到的,是吾爱破解挑战赛里的一个题,给了一个有问题的驱动程序,要求在ubuntu 14.04 32位系统环境下提权。驱动实现了write函数,但是write可以写0x5a0000000个字节。然后还实现了一个ioctl,这里有任意地址写的问题(但是这个分析里没用到)。还有一个read函数,这个可以读取堆上的数据。驱动的代码可以在这里下载到: http://www.52pojie.cn/thread-480792-1-1.html static ssize_t mem_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos) { unsigned long p = *ppos; unsigned int count = size; int ret = 0; struct mem_dev *dev = filp->private_data; if((dev->size >> 24 & 0xff) != 0x5a) //dev->size == 0x5aXXXXXX return -EFAULT; if (p > dev->size) return -ENOMEM; if (count

IO 多路转接 select

痴心易碎 提交于 2020-02-19 00:52:40
TCP状态时序图: 1.主动发起连接请求端: CLOSE --发送SYN--SEND_SYN --接受 ACK、SYN --SEND_SYN--发送 ACK --ESTABLISHED(数据通信状态) 2.主动关闭连接请求端; ESTABLISHED(数据通信状态) --发送FIN --FIN_WAIT_1 --接受 ACK --FIN_WAIT_2(半关闭) --接受对端发送 FIN --FIN_WAIT_2(半关闭) --回发 ACK --TIME_WAIT(只有主动关闭连接方会经历该状态) -- 等 2MLS时长(大约40s) --CLOSE 3.被动接受连接请求端: CLOSE -- LISTEN --接收 SYN -- LISTEN --发送 ACK SYN --SYN_RCVD --接收ACK --ESTABLISHED 4.被动关闭连接请求端: ESTABLISHED -- 接收 FIN --ESTABLISHED --发送ACK --CLOSE_WAIT (说明对端【主动关闭连接请求端】处于半关闭状态) --发送 FIN--LASK_ACK --接收ACK--CLOSE 重点记忆: ESTABLISHED 、FIN_WAIT_2 <->CLOSE_WAIT 、TIME_WAIT(2MLS) 2MLS时长: 一定出现在 主动关闭连接请求端 ---TIME_WAIT

linux网络编程IO模型

为君一笑 提交于 2020-02-18 22:25:37
同步与异步 : 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成。 异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了,异步一般使用状态、通知和回调。 阻塞与非阻塞 阻塞是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。 非阻塞是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 五种IO模型 对于一次IO访问,数据会先被拷贝到内核的缓冲区中,然后才会从内核的缓冲区拷贝到应用程序的地址空间。需要经历两个阶段: 1. 准备数据 2. 将数据从内核缓冲区拷贝到进程地址空间 由于存在这两个阶段,Linux产生了下面五种IO模型。 阻塞IO 当用户进程调用了recvfrom调用时,内核进入IO的第一个阶段:准备数据(内核需要等待足够的数据再拷贝),这个过程需要等待,用户进程会被阻塞,等内核将数据准备好,然后拷贝到用户地址空间,内核返回结果,用户进程才从阻塞态进入就绪态。 Linux中,默认情况下所有的socket都是阻塞的。 非阻塞IO 当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。用户进程判断结果是一个error时,它就知道数据还没有准备好

Linux网络编程-IO复用技术

爷,独闯天下 提交于 2020-02-18 22:25:16
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了。Linux中,提供了select、poll、epoll三种接口函数来实现IO复用。 1、select函数 #include <sys/select.h> #include <sys/time.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); // 返回:若有就绪描述符则为其个数,超时为0,出错-1 nfds参数指定了被监听文件描述符的个数,通常设置为监听的所有描述符最大值加1,因为文件描述符是从0开始的。readfs、writefds和exceptfds分别对应可读、可写和异常等事件文件描述符集合,当调用select时,通过这3个参数传入自己感兴趣的文件描述符,select函数返回后,内核通过修改他们来通知应用程序那些文件描述符已经就绪。 fd_set结构体包含一个整形数组,该数组中每一个元素的每一位标记一个文件描述符,fd_set容纳的文件描述符数量由FD_SETSIZE指定,这就限制了select能同时处理的文件描述符最大个数

嵌入式Linux应用编程-文件IO

十年热恋 提交于 2020-02-18 15:24:22
近期学习了下嵌入式Linux应用编程,一边学习一边记录下关键知识,也是在学习的过程进行下简单梳理。 文件I/O 用户在应用开发过程中会经常需要访问文件。Linux下访问文件的方式有两大类:标准I/O和文件I/O。 文件I/O特点: (1)posix(可移植操作系统接口)定义的一组函数。 (2)不带缓冲机制,每次操作都引起系统调用。 (3)通过文件描述符来访问文件。 (4)访问各种类型文件(7种:- d c b s l p)。 1、文件类型 -:普通文件:可执行文件、文本文档、脚本 d:目录文件 c:字符设备 b:块设备 s:网络设备、socket l:软链接 p:管道 2、文件描述符 每个打开的文件都对应一个文件描述符。 文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符。 文件描述符从0开始分配,依次递增。 在文件IO中默认打开了三个文件描述符0,1,2。对应标准输入、标准输出、标准出错。 3、接口 打开文件 int open(const char *pathname, int flags); 功能:打开一个文件,并且返回一个文件描述符供后续读写类接口使用。 读文件 ssize_t read(int fd, void *buf, size_t count); 功能:从文件描述符为fd的文件/设备读取最大count个字节的数据 写文件 ssize_t

23、【Linux系统编程】truncate ftruncate函数

 ̄綄美尐妖づ 提交于 2020-02-18 03:29:07
truncate ftruncate函数   truncate()和ftruncate()都可以用来修改文件大小,但两者之间也有一些区别。 一、truncate()函数 头文件: #include <unistd.h> 函数定义: int truncate(const char *path, off_t length); 函数调用: truncate("/aaa",500); 函数说明:   truncate()会将参数path指定的文件大小改为参数length指定的大小。 如果原来的文件大小比参数length大,则超过的部分会被删除 返回值:   执行成功则返回0, 失败返回-1, 错误原因存于errno 错误代码: 1 EACCESS 参数path所指定的文件无法存取 2 EROFS 欲写入的文件存在于只读文件系统内 3 EFAULT 参数path指针超出可存取空间 4 EINVAL 参数path包含不合法字符 5 ENAMETOOLONG 参数path太长 6 ENOTDIR 参数path路径并非一目录 7 EISDIR 参数path指向一目录 8 ETXTBUSY 参数path所指的文件为共享程序,而且正被执行中 9 ELOOP 参数path 有过多符号连接问题。 10 EIO I/O存取错误 二、ftruncate()函数 头文件: #include<unistd.h>

fileno函数与ftruncate函数

我的未来我决定 提交于 2020-02-18 03:28:40
fileno()函数 功 能:把文件流指针转换成文件描述符 相关函数:open, fopen 表头文件:#include <stdio.h> 定义函数:int fileno(FILE *stream) 函数说明:fileno()用来取得参数stream指定的文件流所使用的文件描述词 返回值 :返回和stream文件流对应的文件描述符。如果失败,返回-1。 范例: #include <stdio.h> main() { FILE *fp; int fd; fp = fopen("/etc/passwd", "r"); fd = fileno(fp); printf("fd = %d/n", fd); fclose(fp); } 文件描述词是Linux编程中的一个术语。当一个文件打开后,系统会分配一部分资源来保存该文件的信息,以后对文件的操作就可以直接引用该部分资源了。文 件描述词可以认为是该部分资源的一个索引,在打开文件时返回。在使用fcntl函数对文件的一些属性进行设置时就需要一个文件描述词参数。 以前知道,当程序执行时,就已经有三个文件流打开了,它们分别是标准输入stdin,标准输出stdout和标准错误输出stderr。和流式文件相对应的是,也有三个文件描述符被预先打开,它们分别是0,1,2,代表标准输入、标准输出和标准错误输出。 需要指出的是,上面的流式文件输入

2.3freetype矢量字体

蹲街弑〆低调 提交于 2020-02-16 22:02:03
1.简介 将汉字的笔划边缘用直线段描述成封闭的曲线,并将线段各端点的坐标经压缩存储 矢量字库由两部分组成,一部分是汉字的索引信息,一部分是汉字的字形(glyph)数据 当显示文字时,便取出各端点,并通过贝塞尔曲线连接各坐标,最后填充封闭空间 2.freetype在电脑上的体验 PC上安装到(/usr/local/) 1.解压 tar -xjf freetype-2.4.10.tar.bz2 2.重命名 mv freetype-2.4.10 freetype-2.4.10_pc 3.配置 cd freetype-2.4.10_pc ./configure 4.编译 make 5.安装到根目录 sudo make install //直接将库安装到根目录/usr/local/里,所以需要加sudo 编译文件时 eg:编译例程:example1.c(关于freetype的代码) gcc -o example1 example1.c -I /usr/local/include/freetype2/ -lfreetype -lm 解析: -I /usr/local/include/freetype2/ 指定头文件目录 -lfreetype -lm 链接文件,链接freetype库中的函数;链接数学库中的函数 运行 eg: ./example1 simsun.ttc agf /*