文件描述符

epoll(2) 使用及源码分析的引子

北城余情 提交于 2019-12-02 11:47:30
epoll(2) 使用及源码分析的引子 本文代码取自内核版本 4.17 epoll(2) - I/O 事件通知设施。 epoll 是内核在2.6版本后实现的,是对 select(2)/poll(2) 更高效的改进,同时它自身也是一种文件,不恰当的比方可以看作 eventfd + poll。 多路复用也是一直在改进的,经历的几个阶段 select(2) - 只能关注 1024 个文件描述符,并且范围固定在 0 - 1023,每次函数调用都需要把所有关注的数据复制进内核空间,再对所有的描述符集合进行遍历判断。 poll(2) - 改进 select(2) 前面两个缺点,可以自定义关注的描述符,数量也不受限制(不超过系统的限制),每次调用同样需要复制所有的事件进内核空间,全部遍历。 epoll(2) - 不需要每次调用时所有关注的文件描述符进行内核-用户空间的复制,而是直接将所有的文件描述符和事件常驻内核空间,同时也不需要每次遍历所有文件描述符。 提供的系统调用 #include <sys/epoll.h> typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* Epoll

文件描述符与重定向

蹲街弑〆低调 提交于 2019-12-02 11:43:38
文件描述符简介 : 文件描述符在形式上是一个非负整数,每一个文件描述符会与一个打开文件相对应,内核 利用文件描述符来访问文件,最广为人知的文件描述符有stdin(标准输入),stdout(标准输出),stderr(标准错误),系统分别事先为它们保留了三个文件描述符0,1,2,我们也可以通过特殊命令给我们的的文件指定文件描述符。 重定向的意思 :Linux中,IO 重定向 是将某一个文件描述符的内容转移到另一个指定的文件描述符中 , 通常与文件描述符有关。 最常用的我们可以将标准输出的内容重定向到指定文件中。通过重定向操作符(>和>>)可以将输出发送到文件中,而不是终端。>和>>略有差异,尽管两者都可以将文本重定向到文件, 但是前者会清空文件,再写入内容 ,后者会将内容 追加 到现有的文件的尾部, 默认情况下,重定向操作符针对的是标准输出 ,所以>等同于1>,类似的>>等同与1>>。 1:标准输出和标准错误重定向 2:利用<操作符将文件读入stdin 3:自定义文件描述符 4:tee命令 1:例如echo命令就是将指定的字符串送到标准输出,那么我们就可以结合echo命令将指定字符串发送到指定的文件: 在这里就是将文件描述符stdout(1)的内容通过重定向操作符重定向到了test.txt文件里。 在处理错误时,来自stderr的输出被倾倒入了文件/dev/null中,/dev

IO复用一select, poll, epoll用法说明

…衆ロ難τιáo~ 提交于 2019-12-02 11:02:21
三种IO复用类型 Select系统调用 #include<sys/select.h> int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* execptfds,struct timeval* timeout); #nfds表示监听的文件描述符总数; #readfds,writefds,execptfds分别表示对应的fd_set类型的集合 可以如下定义:fd_set readfds,writefds,execptfds #timeout表示select函数的超时时间 Struct timeval { Long tv_sec; Long tv_usec; } 如果timeval成员变量均为0,则select立即返回;如果timeout设置为NULL,则select将一直阻塞,直到某个文件描述符就绪。 # FD_ZERO(fd_set *fdset);清楚fdset的所有位,如FD_ZERO(&readfds); #FD_SET(int fd,fd_set* fdset);设置fdset的位,也就是将某个文件描述符加入到fdset中,如FD_SET(0,&readfds),将标准输入加入到fdset中 #int FD_ISSET(int fd,fd_set * fdset);测试fdset的某个位是否被设置

3.0 重定向和文件的查找

巧了我就是萌 提交于 2019-12-02 09:12:46
重定向和文件的查找 本节所讲内容: 文件描述符 0、1、2 重定向的含义-管道的使用-tee命令 which-whereis-locate-grep-find查找命令 命令判断 Linux下一切皆文件 文件又可分为:普通文件、目录文件、链接文件、设备文件 LINUX系统使用文件来描述各种硬件设备资源,如:/dev/sda /dev/sdb /dev/sr0 1、文件描述符定义 文件描述符 :是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的文件是0,第二个是1,依此类推。也可以理解为是一个文件的身份ID 用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器) 1)输入输出标准说明 STDIN 标准输入 默认的设备是键盘 文件编号为:0 STDOUT 标准输出 默认的设备是显示器 文件编号为:1 ,也可以重定向到文件 STDERR 标准错误 默认的设备是显示器 文件编号为:2 ,也可以重定向到文件 例1:查看一个进程打开了哪些文件? 语法: ll /proc/进程ID/fd 例: [ root@CHENDAJIE ~ ] # vim /etc/passwd [ root@CHENDAJIE ~ ] #

python os 方法

北战南征 提交于 2019-12-02 03:38:45
Python3 OS 文件/目录方法 os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示: 序号 方法及描述 1 os.access(path, mode) 检验权限模式 2 os.chdir(path) 改变当前工作目录 3 os.chflags(path, flags) 设置路径的标记为数字标记。 4 os.chmod(path, mode) 更改权限 5 os.chown(path, uid, gid) 更改文件所有者 6 os.chroot(path) 改变当前进程的根目录 7 os.close(fd) 关闭文件描述符 fd 8 os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 9 os.dup(fd) 复制文件描述符 fd 10 os.dup2(fd, fd2) 将一个文件描述符 fd 复制到另一个 fd2 11 os.fchdir(fd) 通过文件描述符改变当前工作目录 12 os.fchmod(fd, mode) 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 13 os.fchown(fd, uid, gid) 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定

lsof命令

别等时光非礼了梦想. 提交于 2019-12-01 23:24:22
[root@localhost ~]# rpm -qa|grep lsof lsof-4.82-4.el6.x86_64 在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。 lsof - list open files Lsof revision 4.82 lists on its standard output file information about files opened by processes for the following UNIX dialects: AIX 5.3 Apple Darwin 9 (Mac OS X 10.5) FreeBSD 4.9 for x86-based systems FreeBSD 7.[012] and 8.0 for AMD64-based systems Linux 2.1.72 and above for x86-based systems Solaris 9 and 10 An open file may be a regular file, a directory, a block special file, a character special

文件描述符理解

时光毁灭记忆、已成空白 提交于 2019-12-01 19:42:12
Linux文件描述符 参考出处:https://www.jianshu.com/p/cded914786d5 与linux打交道,尽管可能你只是一个高级语言的码农,还是或多或少的要和遇到d这种术语。今天抽空看了下传说中的fd,虽然还没有深入了解linux操作系统,因此也谈不上真的深刻理解了fd,但还是扫盲了些许,至少以后再碰到相关术语,不至于一脸茫然。 说明:看了一些网上的文章,大多数语句都是在理解的基础上直接搬过来的,感谢那些整理的人们,就不一一列举出处了。 1. Linu文件系统简介 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。 Unix可以把一个能随机存取的存储介质(如:硬盘、软盘和光盘)上的存储空间划分成一致多个区域,每个区域都可以像独立的物理设备一样单独进行管理和数 据存取,这样的存储区域,即是逻辑设备。在逻辑设备上按照一定的格式进行划分,就构成了逻辑文件系统,简称文件系统。 普通文件 这种文件包含了某种形式的数据,这些数据无论是文件还是二进制对于 UNIX 内核而言都是一样的。对普通文件内容的解释有处理该文件的应用程序进行。 目录文件 目录文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读权限的任一进程都可以读取该目录的内容

Nginx日志配置

久未见 提交于 2019-12-01 19:36:27
作者:antwang juejin.im/post/5aa09bb3f265da238f121b6c 前言 Nginx日志对于统计、系统服务排错很有用。 Nginx日志主要分为两种: access_log(访问日志)和error_log(错误日志)。通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。错误日志记录了访问出错的信息,可以帮助我们定位错误的原因。 本文将详细描述一下如何配置Nginx日志。 设置access_log 访问日志主要记录客户端的请求。客户端向Nginx服务器发起的每一次请求都记录在这里。客户端IP,浏览器信息,referer,请求处理时间,请求URL等都可以在访问日志中得到。当然具体要记录哪些信息,你可以通过log_format指令定义。 语法 access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 设置访问日志 access_log off; # 关闭访问日志 path 指定日志的存放位置。 format 指定日志的格式。默认使用预定义的combined。 buffer 用来指定日志写入时的缓存大小。默认是64k。 gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1

ARTS

青春壹個敷衍的年華 提交于 2019-12-01 18:43:51
每周完成一个 ARTS: Algorithm 来源 LeetCode 438. Find All Anagrams in a String。 Review 分享关于 IO 多路复用之 select,poll,epoll 详解。 Tip 分享 50 行 Python 代码实战,教你用微信每天自动给女朋友说晚安。 Share 分享有关于批判性思维的思考。 一 Algorithm 438. Find All Anagrams in a String 链接 难度:[Eazy] 【题意】 Given a string s and a non-empty string p , find all the start indices of p ‘s anagrams in s . Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100. The order of output does not matter. Example 1: 123456789 Input:s: "cbaebabacd" p: "abc"Output:[0, 6]Explanation:The substring with start

进程间通信方式总结

ⅰ亾dé卋堺 提交于 2019-12-01 13:48:37
一、简单的进程间通信   1. 命令行参数 :argc argv;   2. 环境变量   3. 信号 signal     signal信号机制是属于计算机异常处理机制中的一种。     signal信号属于一种异步处理异常的机制之一。     不可靠信号:小于34,不支持排队,可能会丢失。     可靠信号:34-64,支持排队,不会丢失。     未决信号:处于递送阶段的信号状态 处于未决状态的不可靠信号只有一份,相同的可靠信号可以有多份。     函数:sigqueue(对不可靠的信号不做排队,会丢失信号) | sigaction。     signal(SIGINT,signet); ---SIGINT 信号码,signet信号处理函数 :SIG_IGN忽略该信号,SIG_DFI默认处理函数。     子进程会继承父进程的信号处理方式,直到子进程调用exec函数。     发送信号的方式:       ① 键盘 : Ctrl+C 中断 Ctrl+\ 退出 Ctrl+Z 暂停;       ② 错误;       ③ 命令 (kill -信号 进程号);       ④ 函数 kill(pid,sig)           pid>0,向进程发送sig信号;           pid=0,向同进程组的所有进程发送信号;           pid=-1,向所有进程发送信号