文件描述符

网络编程——TCP编程

╄→гoц情女王★ 提交于 2019-11-28 11:08:20
前言 使用TCP通信时,TCP协议要求必须要有一个服务器端。这一点是由TCP协议本身的特性决定的,只要你使用TCP协议来通信,就必须要有一个TCP服务器端。 TCP服务器的大概工作过程 (1)服务器会使用专门“文件描述符”来监听客户的“三次握手”,然后建立连接。 (2)一旦连接建立成功后,服务器会分配一个专门的 “通信文件描述符”,用于实现与该连接客户的通信 由于建立连接时,双方的TCP协议都已经记住了对方IP和端口,所以双方正式通信时,TCP会自动使用记录的IP和端口,我们不需要重新指定对方的IP和端口。 TCP编程模型 在编程模型里面,必须要有一方是TCP服务器,另一方是TCP客户。服务器只有一个,但是客户端有很多,不管客户端有多少个,客户端与服务器端的通信,都按照编程模型的描述来实现的。 API socket 原型 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); 功能 创建一个套接字文件,然后以文件形式来操作通信,不过套接字文件没有文件名。 参数 domian 作用:指定协议族 为什么要指定协议族? 因为你要使用的通信协议一定是属于某个协议族,所以如果不指定协议族,又怎么指定协议族中的某个具体协议呢。比如我们想用的是TCP协议

epoll使用详解(精髓)

社会主义新天地 提交于 2019-11-28 09:02:13
epoll - I/O event notification facility 在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。 相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明: #define __FD_SETSIZE 1024 表示select最多同时监听1024个fd,当然,可以通过修改头文件再重编译内核来扩大这个数目,但这似乎并不治本。 epoll的接口非常简单,一共就三个函数: 1. int epoll_create(int size); 创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。 2. int epoll_ctl(int epfd, int op, int fd, struct

epoll 使用详解

妖精的绣舞 提交于 2019-11-28 09:01:41
epoll简介 epoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高),epoll 与 FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作。 int epoll_create(int size); 创建一个epoll的句柄,size用来告诉内核需要监听的数目一共有多大。当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close() 关闭,否则可能导致fd被耗尽。 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); epoll的事件注册函数,第一个参数是 epoll_create() 的返回值,第二个参数表示动作,使用如下三个宏来表示: EPOLL_CTL_ADD //注册新的fd到epfd中;EPOLL_CTL_MOD /

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

孤街浪徒 提交于 2019-11-28 08:37:21
小白科普:Netty有什么用? 原创: 老刘 码农翻身 2017-11-20 随着移动互联网的爆发性增长,小明公司的电子商务系统访问量越来越大,由于现有系统是个单体的巨型应用,已经无法满足海量的并发请求,拆分势在必行。 在微服务的大潮之中, 架构师小明把系统拆分成了多个服务,根据需要部署在多个机器上,这些服务非常灵活,可以随着访问量弹性扩展。 世界上没有免费的午餐, 拆分成多个“微服务”以后虽然增加了弹性,但也带来了一个巨大的挑战:服务之间互相调用的开销。 比如说:原来用户下一个订单需要登录,浏览产品详情,加入购物车,支付,扣库存等一系列操作,在单体应用的时候它们都在一台机器的同一个进程中,说白了就是模块之间的函数调用,效率超级高。 现在好了,服务被安置到了不同的服务器上,一个订单流程,几乎每个操作都要越网络,都是远程过程调用(RPC), 那执行时间、执行效率可远远比不上以前了。 远程过程调用的第一版实现使用了HTTP协议,也就是说各个服务对外提供HTTP接口。 小明发现,HTTP协议虽然简单明了,但是废话太多,仅仅是给服务器发个简单的消息都会附带一大堆无用信息: GET /orders/1 HTTP/1.1 Host: order.myshop.com User-Agent: Mozilla/5.0 (Windows NT 6.1; ) Accept: text/html;

文件IO

荒凉一梦 提交于 2019-11-28 07:57:16
目录 文件IO 文件描述符 获取最大支持的描述符 open/openat/creat close lseek off_t 类型说明 lseek与OAPPEND的区别 内核维护的文件信息 dup/dup2 FD_CLOEXEC 缓存同步到存储 fcntl改变文件属性 ioctl 文件截断 代码附录 获取最大文件描述符 使用openat来实现一种相对路径的打开 lseek测试管道等 lseek文件跨越写 fcntl获取文件状态 title: 文件IO date: 2019/11/23 10:49:52 toc: true --- 文件IO 文件描述符 文件描述符是非负的整数,一般是系统调用的,这个与 file_struct 区别开来. STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO 被定义在 <unistd.h> 获取最大支持的描述符 新的 linux 已经不支持 OPEN_MAX 来直接获取这个最大描述符了, sysconf(_SC_OPEN_MAX) shell 下这么查看,其中的 open files (-n) 1024 就是了 reallin@ubuntu:/work/pan/apue$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d)

linux下恢复删除的文件

心不动则不痛 提交于 2019-11-28 07:49:33
Linux下面不小心删除了文件,怎么恢复 模拟场景 1. 删除 先不小心删掉服务器上的/root/selenium/Spider下的MySql.Data.dll文件 然后我心里很慌 2. 恢复 1.使用lsof命令查看当前是否有进程打开/root/selenium/Spider/MySql.Data.dll文件: 从上面可以看出,当前文件状态为已删除(deleted) 2.查看是否存在恢复数据: /proc/13067/fd :进程操作的文件描述符目录。 86 :文件描述符。 cat /proc/13067/fd/86 3.使用I/O重定向恢复文件: > cat /proc/23778/fd/86 > /root/selenium/Spider/MySql.Data.dll > ls -l /root/selenium/Spider/MySql.Data.dll -rw-r--r-- 1 root root 702464 Feb 10 12:03 /root/selenium/Spider/MySql.Data.dll 重新运行程序: 说明恢复的文件没有问题。 刨根问底 通过前面的模拟场景演示了恢复文件的整个过程,那么原理是什么,在什么情况下,文件才是可恢复的。 在Linux系统中,每个运行中的程序都有一个宿主进程彼此隔离,以 /proc/进程号 来体现

查看docker容器日志

谁都会走 提交于 2019-11-28 07:18:30
查看当前运行的容器 docker ps 查看日志 // 查看实时日志 docker logs -f 容器id // 查看已经打印的日志 docker logs 容器id // 关键字搜索日志 docker logs 容器id 2<&1| grep "xxx" // 把日志重定向到指定文件log.txt中 docker logs 容器id >> log.txt 2<&1 标准输入文件描述符:0 标准输出文件描述符:1 标准错误文件描述符:2 linux标准输入、输出、重定向: https://www.cnblogs.com/bolang100/p/10755814.html https://www.cnblogs.com/softidea/p/3965093.html 来源: https://blog.csdn.net/u010918487/article/details/100030415

Internet socket和Unix socket

╄→尐↘猪︶ㄣ 提交于 2019-11-28 05:37:30
socket是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 UNIX/Linux 中的一切都是文件,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。 为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。例如: 通常用 0 来表示标准输入文件(stdin),它对应的硬件设备就是键盘; 通常用 1 来表示标准输出文件(stdout),它对应的硬件设备就是显示器。 UNIX/Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入 一个文件描述符 。一个文件描述符只是一个和打开的文件相关联的 整数 ,它的背后可能是一个硬盘上的 普通文件 、FIFO、管道、终端、键盘、显示器,甚至是一个 网络连接 。 通过 socket() 函数可以创建一个网络连接,或者说打开一个网络文件,socket() 的返回值就是文件描述符。剩下的操作就是对这个文件的操作了 这个世界上有很多种套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地节点的路径名(Unix套接字)

Linux基础命令:lsof

被刻印的时光 ゝ 提交于 2019-11-28 00:33:01
简介 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 输出信息含义 在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。 直接输入lsof部分输出为: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEinit 1 root cwd DIR 8,1 4096 2 /init 1 root rtd DIR 8,1 4096 2 /init 1 root txt REG 8,1 150584 654127 /sbin/initudevd 415 root 0u CHR 1,3 0t0 6254 /dev/nulludevd 415 root 1u CHR 1,3 0t0

xinetd超级服务器进程

雨燕双飞 提交于 2019-11-27 23:26:36
xinetd的实质和inetd差不多,只不过增加了访问控制功能,更加安全了。实际上xinetd就是一个超级服务器,是个把门的守护者,在linux 丰富的网络应用中实现单点验证,它继承了unix的传统工作方式,只提供机制,而将策略留给用户,正如unix的一个很重要的特性所说,一切都是可以配置 的。它的策略配置方式就是修改配置文件,在linux中不出意外的话,任何程序都要有一个配置文件,在这个配置文件中,用户可以自己定义该程序的行为,这 样的话,用户的技术门槛降低了,但是又不至于过低,于是管理linux的过程也就成了管理配置文件的过程,配置文件大多都是标准的文本格式,提供了最好的 兼容性,时隔几十年,只要最基本的编码体制不变,这些文件都保证是可读的,不像那些商业软件中,比如word,如果没有特定的程序,文件是无法被以可读形 式打开的。当然xinetd也有其配置文件,在/etc目录下,本文不讲xinetd的用法,需要的话,可以查阅相关手册。 xinetd的工作方式很简单,就是从其配置文件中得到它要代理的网络程序,得到该网络应用比如telnet需要监听的端口,然后代替该应用监听此端口, 当然不仅仅是例子中的telnet,任何需要它代理的网络应用都可以配置进xinetd,然后由它帮忙,今天就以telnet为例。telnet的监听端 口是23,当xinetd监听到23号端口有连接的时候