文件描述符

shell 脚本命令 : 重定向

杀马特。学长 韩版系。学妹 提交于 2019-11-29 09:22:50
最近在看shell 脚本命令 : 重定向 :即重新改变输入输出的来源 希望想将在终端输出的信息保存到文件,直接在命令后面加上> filename即可 希望想将在终端输出的信息保存到文件,直接在命令后面加上> filename即可 echo “字符串” > test.txt echo “字符串” | tee test.txt Shell允许打开至多10个文件,文件描述符从0,1,2,…,9 文件描述符0,表示标准输入 文件描述符1,表示标准输出 文件描述符2,表示标准错误输出 在当前路径下 执行.sh 文件 ./test.sh 如果没有其权限: c h m o d + x [ 文 件 路 径 ] 查 看 当 前 目 录 结 构 c h m o d + x [ 文 件 路 径 ] 查 看 当 前 目 录 结 构 //--> tree 当前文件夹下的目录结构 如上图 在我们执行ls test.txt b.txt之后,一共有两种输出,其中ls: 无法访问b.txt: 没有那个文件或目录是错误输出,test.txt是标准输出。 在上述命令中,我们将原来的标准输出重定向到了out文件中,所以控制台只剩下了错误提示。 高级用法 我们来看 /dev/null 2>&1 这条命令其实分为两命令,一个是>/dev/null,另一个是2>&1。 - >/dev/null

zz文件系统磁盘布局与I/O映射

别等时光非礼了梦想. 提交于 2019-11-29 06:48:57
http://www.sysnote.org/2015/08/06/fs-io-map/ 本文主要对文件系统的磁盘布局进行概要的梳理,并在此基础上分析文件系统I/O到块I/O的映射机制。 1.文件系统磁盘布局 首先文件系统层面来阐述文件与块设备的关系。 1.1文件描述符与inode 应用程序在访问文件时都会先打开文件,在内核中,对应每个进程,都会有一个文件描述符表表示这个进程打开的文件,但是用户程序不能直接访问内核中的文件描述符表,而只能使用文件描述符表的索引(一个整数),这些索引就被称为文件描述符。当调用open 打开一个文件或创建一个新文件时,内核分配一个文件描述符并返回给用户程序,该文件描述符表项中的指针指向新打开的文件。 文件描述表中每一项都是一个指针,指向一个用于描述打开的文件的数据块–file对象,file对象中描述了文件的打开模式,读写位置等重要信息,当进程打开一个文件时,内核就会创建一个新的file对象。需要注意的是,file对象不是专属于某个进程的,不同进程的文件描述符表中的指针可以指向相同的file对象,从而共享这个打开的文件。file对象有引用计数,记录了引用这个对象的文件描述符个数,只有当引用计数为0时,内核才销毁file对象,因此某个进程关闭文件,不影响与之共享同一个file对象的进程。 file对象中包含一个指针,指向dentry对象

网络

↘锁芯ラ 提交于 2019-11-29 05:39:56
接收网络包流程 网络适配器 接收到数据后(如果目的地址不正确会丢弃),经过 I/O 总线、内存总线,复制到 内存 (通常是通过 DMA 传送),并触发 硬中断 来通知 CPU,CPU 会更新硬件寄存器状态(表示数据已经读好了),然后发送软中断信号。 软中断 处理程序(ksoftirqd 线程)为该包分配内核中的数据结构 sk_buff ,并把包复制到 sk_buff 缓冲区 中。内核从缓冲区取出来,通过网络协议栈 逐层处理包 。传输层里取出 TCP 或 UDP 头后,根据 { 源 IP,源端口,目的 IP,目的端口 } 找出 对应的 socket ,把数据复制到 socket 的 接收队列缓冲区 中。应用程序通过 socket 接口 获取到该数据。 发送网络包流程 应用程序通过 socket 系统调用 陷入内核,内核把数据放到 socket 的 发送缓冲区 。网络协议栈取出数据后,按照 TCP/IP 逐层处理。比如传输层、网络层,分别增加 TCP 头、IP 头,执行路由查找 下一跳 IP ,并按照 MTU 大小进行 分片 。 分片后的网络包,送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址 。然后放到发包队列,通过 软中断 通知 驱动程序 。 最后,驱动程序通过 DMA ,从发包队列中取出网络帧,并通过 网卡 把它发送出去。 连接 所谓连接,就是两端 数据结构

Swoole.001.手撸网络服务器模型

百般思念 提交于 2019-11-28 23:59:55
github: https://github.com/masterzcw/swoole Swoole进程结构 Master进程: 主进程 Manger进程: 管理进程 Worker进程: 工作进程 Task进程: 异步任务工作进程 Master进程 第一层, Master进程, 这个是swoole的主进程,这个进程是用于处理swoole的核心事件驱动的, 那么在这个进程当中可以看到它拥有一个MainReactor[线程]以及若干个Reactor[线程], swoole所有对于事件的监听都会在这些线程中实现, 比如来自客户端的连接, 信号处理等. 1.1 MainReactor(主线程) 主线程会负责监听server socket, 如果有新的连接accept, 主线程会评估每个Reactor线程的连接数量. 将此连接分配给连接数最少的reactor线程, 做一个负载均衡. 1.2 、Reactor线程组 Reactor线程负责维护客户端机器的TCP连接、处理网络IO、收发数据完全是异步非阻塞的模式. swoole的主线程在Accept新的连接后, 会将这个连接分配给一个固定的Reactor线程, 在socket可读时读取数据, 并进行协议解析, 将请求投递到Worker进程. 在socket可写时将数据发送给TCP客户端. 1.3、心跳包检测线程(HeartbeatCheck)

嵌入式linux4412多路复用式串口操作(select和poll实现方法)

时光总嘲笑我的痴心妄想 提交于 2019-11-28 22:47:44
1实验目的 通过编写多路复用式串口读写,进一步理解多路复用函数的用法,同时更加熟练地掌握LINUX设备文件的读写方法。 2、实验内容 本实验中,实现两台机器(宿主机和目标板)之间的串口通信,而且每台机器均可以发送数据和接收数据。除了串口的设备名称不同,两台机器上的程序基本相同。 首先,程序打开串口设备文件并进行相关配置,调用select()函数或poll()函数,使它等待从标准输入(终端)文件中的输入数据及串口设备的输入数据。 1、如果有标准输入文件上的数据,则写入到串口,使对方读取。 2、如果有串口设备上的输入数据,则将数据写入到普通文件中。 select函数 LINUX系统提供select函数来实现 多路复用输入/输出模型 ,原型: int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的 可读文件描述符 的集合, 可写文件描述符 的集 合及 异常文件描述符 的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。 1.timeout=NULL( 阻塞 :select将一直被阻塞

如何理解 Linux shell中“2》&1”?

大憨熊 提交于 2019-11-28 22:03:21
来自:编程珠玑(微信号:shouwangxiansheng) 前言 有时候我们常看到类似这样的脚本调用: ./test.sh > log.txt 2>&1 这里的2>&1是什么意思?该如何理解? 先说结论:上面的调用表明将./test.sh的输出重定向到log.txt文件中,同时将标准错误也重定向到log.txt文件中。 有何妙用 (如果已经明白是什么作用,可跳过此小节) 上面到底是什么意思呢?我们来看下面的例子,假如有脚本test.sh: #!/bin/bash date #打印当前时间 while true #死循环 do #每隔2秒打印一次 sleep 2 whatthis #不存在的命令 echo -e "std output" done 脚本中先打印当前日期,然后每隔2秒执行whatthis并打印一段字符。由于系统中不存在whatthis命令,因此执行会报错。 假如我们想保存该脚本的打印结果,只需将test.sh的结果重定向到log.txt中即可: ./test.sh > log.txt 执行结果如下: ubuntu$ ./test.sh >log.txt ./test.sh: 行 7: whatthis: 未找到命令 我们明明将打印内容重定向到log.txt中了,但是这条错误信息却没有重定向到log.txt中。如果你是使用程序调用该脚本,当查看脚本日志的时候

网络IO

霸气de小男生 提交于 2019-11-28 21:36:27
大并发服务器框架 大并发服务器设计目标 高性能(High Performance). 要求编写出来的服务器能够最大限度发挥机器性能, 使得机器在满负荷的情况下能够处理尽可能多的并发请求, 对于大量并发请求能够及时快速做出响应 高可用(High Availability). 要求服务器7*24小时服务, 故障转移 伸缩性(Scalability). 服务器具有良好框架, 分层设计, 业务分离, 并且能够进行灵活部署 分布式: 负载均衡 分布式存储 分布式计算 C/S结构: 任何网络系统都可以抽象为C/S结构(客户端, 服务端) 网络I/O+服务器高性能编程技术+数据库 超出数据库连接数: 数据库并发连接数10个, 应用服务器这边有1000个并发请求, 将会有990个请求失败. 解决办法: 增加一个中间层DAL(数据库访问控制层), 一个队列进行排队 超出时限: 数据库并发连接数10个, 数据库1秒钟之内最能处理1000个请求, 应用服务器这边有10000个并发请求, 会出现0-10秒的等待. 如果系统规定响应时间5秒, 则该系统不能处理10000个并发请求, 这时数据库并发能力5000, 数据出现瓶颈. 数据库瓶颈缓解 提高数据库的并发能力 队列+连接池(DAL) 主要逻辑挪到应用服务器处理, 数据库只做辅助的业务处理. 在数据库上进行计算能力或处理处理逻辑不如操作系统效率高. --

Epoll简介以及例子

∥☆過路亽.° 提交于 2019-11-28 13:48:04
第一部分:Epoll简介 问题 : S elect,Poll和Epoll的区别 答案 : Epoll和Select的区别 1. 遍历方式的区别 。select判断是否有事件发生是遍历的,而epoll是事件响应的,一旦句柄上有事件来了,就马上选出来。 2. 数目的区别。 select一般由一个内核参数(1024)限制了监听的句柄数,但是epoll通常受限于打开文件的数目,通常会打得多。 3. epoll自身,还有两种触发方式。 水平触发和边缘触发。边沿触发的效率更高(高了不少,但是编程的时候要小心处理每个时间,防止漏掉处理某些事件)。 Select select()系统调用提供一个机制来实现同步多元I/O: #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select ( int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); FD_CLR( int fd, fd_set *set); FD_ISSET( int fd, fd_set *set); FD_SET( int fd, fd_set *set); FD_ZERO(fd_set *set); 调用select()将阻塞

服务器之select

守給你的承諾、 提交于 2019-11-28 13:45:34
select select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 解决1024以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率,不应在select上投入更多精 #include <sys/select.h> /* According to earlier standards */ #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); nfds: 监控的文件描述符集里最大文件描述符加1,因为此参数会告诉内核检测前多少个文件描述符的状态 readfds: 监控有读数据到达文件描述符集合,传入传出参数 writefds: 监控写数据到达文件描述符集合,传入传出参数 exceptfds: 监控异常发生达文件描述符集合,如带外数据到达异常,传入传出参数 timeout: 定时阻塞监控时间,3种情况 1.NULL,永远等下去 2.设置timeval,等待固定时间

Linux中select poll和epoll的区别

和自甴很熟 提交于 2019-11-28 12:14:47
在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并 发的场景下,nginx越来越收到欢迎。这里有个文章参考。 Nginx成为全球Top1000网站最受欢迎的Web服务器。 据 w3techs 7月 3 日的统计数据表明,在全球 Top 1000 的网站中,有 34.9% 的网站在使用 Nginx,这使得 Nginx 超越了 Apache,成为了高流量网站最信任的 Web 服务器。下图是统计数据。 select: 下面是select的函数接口: int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可)