文件句柄

基于logrotate进行自动化日志切割、日志压缩和周期删除

我只是一个虾纸丫 提交于 2020-02-27 16:09:46
前言 这篇博文以课程课件为蓝本来探讨logrotate和自动化日志处理的一系列课题,细节和深层次原理部分略有删减, 是一篇被课程耽误了的技术博文。 既然谈的很直白,是一篇被课程耽误了的技术博文,如若有打着博客做引导或者拿着开源工具不开源之类的讨伐和道德绑架,恕不回复。 这里是分割线,不废话了,直接切入正文,对课程有兴趣,想深入理解logrotate的朋友可以关注文末课程介绍:) 1.日志切割的概念、必要性和基本思路 1.1 什么是日志切割 日志切割是指当应用或系统的日志文件达到设定的触发条件(如按照一定的时间周期:每天,按照大小:500MB),对其进行切割/分割处理,类似截断处理,把原本容量比较大的日志文件“劫走”转存为另外一个日志文件留存归档,这一刻之后产生的日志,继续输出到文件头被重置为0的日志文件中。 变化的部分 :日志文件的容量(瘦身变小),日志文件的个数(多出一份被切割下的历史日志) 不变的部分 :日志文件名不变 此外,一段时间后,我们还需要删除时间久远的日志文件,整个过程也被俗称为日志滚动(log rotation)。 1.2 为什么要进行日志切割 在线应用(包括操作系统)在长期运行过程中,会产生很多过程日志记录,通常是应用程序记录的一些对系统管理员或者程序开发者有用的信息的文件,诸如正在执行什么、发生了什么错误等一系列信息。 随着日志记录的不断积累,日志文件越来越大

Windows进程的内核对象句柄表

有些话、适合烂在心里 提交于 2020-02-24 05:54:45
当一个进程被初始化时,系统要为它分配一个句柄表。该句柄表只用于内核对象 ,不用于用户对象或GDI对象。 创建内核对象 当进程初次被初始化时,它的句柄表是空的。然后,当进程中的线程调用创建内核对象的函数时,比如CreateFileMapping,内核就为该对象分配一个内存块,并对它初始化。这时,内核对进程的句柄表进行扫描,找出一个空项。由于表 3 - 1中的句柄表是空的,内核便找到索引1位置上的结构并对它进行初始化。该指针成员将被设置为内核对象的数据结构的内存地址,访问屏蔽设置为全部访问权,同时,各个标志也作了设置。 下面列出了用于创建内核对象的一些函数(不是个完整的列表): HANDLE CreateThread( PSECURITY_ATTRIBUTE psa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam, DWORD dwCreationFlags, PDWORD pdwThreadId); HANDLE CreateFile( PCTSTR pszFileNAme, DWORD dwDesiredAccess, DWORD dwShareMode, PSECURITY_ATTRIBUTES psa, DWORD dwCreationDistribution, DWORD

【整理】句柄.内核对象

人走茶凉 提交于 2020-02-24 05:53:08
  句柄是一个标识符,是拿来标识对象或者项目的。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是驻留在内存中的。 C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 内核对象    内核对象只是内核分配的一个内存块,并且只能由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。 有些数据成员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型。例如,进程对象有一个进程 I D 、一个基本优先级和一个退出代码,而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。    内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容 。 Microsoft 规定了这个限制条件,目的是为了确保内核对象结构保持状态的一致。这个限制也使 Microsoft 能够在不破坏任何应用程序的情况下在这些结构中添加、 删除和修改数据成员。 内核对象包括 如下

windows内核对象句柄

青春壹個敷衍的年華 提交于 2020-02-24 05:27:56
内核对象用于管理进程、线程和文件等诸多种类的大量资源,每一个内核对象都只是一个句内存快,它由操作系统内核分配,并只能右操作系统内核访问。这个内存块是一个数据结构,其维护着与对象相关的信息,其中少数成员是所有对象都有的,其他大多数都是不同类型的对象特有的。 由于内核对象只能由操作系统内核访问,因此windows提供了句柄来标识内核对象,对于应用程序来说,这个句柄就相当于这个内核对象。应用程序创建一个内核对象,就会返回对应的句柄,然后可以以这个句柄作为参数,去调用操纵和关闭内核对象的函数。 操作系统内核通过记录内核对象的使用计数,来维护内核对象的生存周期。初始创建的内核对象使用计数被设置为1,当其他进程获得对现有内核对象的访问后,使用计数就会递增,当其他进程主动关闭内核对象或者退出进程时,使用计数递减,当使用计数减为0时,操作系统内核就会销毁该对象。 为了维护内核对象的安全性,windows提供了安全描述符来记录谁拥有对象,哪些组和用户被允许访问或者使用对象,哪些组和用户被拒绝访问此对象。因此,几乎所有创建时提供了SECURITY_ATTRUBUTES(这个结构体包含了安全描述符对象指针)作为指针参数的对象,都是内核对象。 每个进程在初始化时,系统都为它分配了一个句柄表,这个句柄表仅供内核对象使用,我们称其为进程内核对象句柄表。 一个进程内核对象句柄表(简称进程的句柄表),只是一个数组

什么是句柄

无人久伴 提交于 2020-02-21 14:26:41
版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及 本声明 http://jellyfish.blogbus.com/logs/319589.html 所谓 句柄实际上是一个数据,是一个Long (整长型)的数据。 句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。 从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。 如果想更透彻一点地认识句柄,我可以告诉大家, 句柄是一种指向指针的指针。 我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象

JAVA RTTI

泄露秘密 提交于 2020-02-16 20:34:56
  基础类可接收我们发给派生类的任何消息,因为两者拥有完全一致的接口。我们要做的全部事情就是从派生上溯造型,而且永远不需要回过头来检查对象的准确类型是什么。所有细节都已通过多态性获得了完美的控制。   但经过细致的研究,我们发现扩展接口对于一些特定问题来说是特别有效的方案。可将其称为“类似于”关系,因为扩展后的派生类“类似于”基础类——它们有相同的基础接口——但它增加了一些特性,要求用额外的方法加以实现。如下所示: 尽管这是一种有用和明智的做法,但它也有一个缺点:派生类中对接口扩展的那一部分不可在基础类中使用。所以一旦上溯造型,就不可再调用新方法: 若在此时不进行上溯造型,则不会出现此类问题。但在许多情况下,都需要重新核实对象的准确类型,使自己能访问那个类型的扩展方法。 下溯造型与运行期类型标识:   由于我们在上溯造型期间丢失了具体的类型信息,所以为了获取具体的类型信息——亦即在分级结构中向下移动——我们必须使用 “下溯造型”技术。然而,我们知道一个上溯造型肯定是安全的;基础类不可能再拥有一个比派生类更大的接口。因此,我们通过基础类接口发送的每一条消息都肯定能够接收到。 但在进行下溯造型的时候,我们并不真的知道是什么具体类型。   为解决这个问题,必须有一种办法能够保证下溯造型正确进行。只有这样,我们才不会冒然造型成一种错误的类型。   在某些语言中(如C++),为了进行保证

操作系统中的句柄是什么?(转)

懵懂的女人 提交于 2020-02-16 08:03:16
1.这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。 2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节。 程序运行到某时刻的内存快照 程序往后运行到另一时刻时的内存快照 Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。 系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A

Linux最大文件打开数

一世执手 提交于 2020-02-16 07:29:25
Linux最大文件打开数 介绍 在Linux下有时会遇到Socket/File : Can't open so many files的问题。其实Linux是有文件句柄限制的,而且Linux默认一般都是1024(阿里云主机默认是65535)。在生产环境中很容易到达这个值,因此这里就会成为系统的瓶颈。 1.查看方法 使用ulimit -a 或者 ulimit -n open files (-n) 1024 是linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的套接字数量) 这里只是对用户级别的限制,其实还有个是对系统的总限制,查看系统总线制: # cat /proc/sys/fs/file-max man proc,可得到file-max的描述: /proc/sys/fs/file-max This file defines a system-wide limit on the number of open files for all processes. (See also setrlimit(2), which can be used by a process to set the per-process limit, RLIMIT_NOFILE, on the number of files it may open.) If you get lots of

python File常用操作

狂风中的少年 提交于 2020-02-04 22:41:37
python File常用操作 data = open(“yesterday”,encoding=“utf-8”).read() print(data) 文件句柄,"w"为写模式,“r"为读模式 “a"为追加模式 模式一直一种一种使用,不能混着用 //读模式: f = open(“yesterday”,“r”,encoding=“utf-8”)//文件句柄 data = f.read() print(data) //写模式: f = open(“yesterday”,“w”,encoding=“utf-8”)//文件句柄 f.write(“hello world beijingtiananmen*******”) f.write(”////hengekda 嗯哼大量”) //追加模式:(如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件进行写入。) f = open(“yesterday”,“a”,encoding=“utf-8”)//文件句柄 f.write(“hello *******”) f.write(“44444”) f.close() //关闭文件 f = open(“yesterday”,“r”,encoding=“utf-8”)//文件句柄 print(f.readline())//读第一行 for i in range(5): print

nginx worker进程循环

梦想的初衷 提交于 2020-02-04 12:46:09
  worker进程启动后,其首先会初始化自身运行所需要的环境,然后会进入一个循环,在该循环中不断检查是否有需要执行的事件,然后处理事件。在这个过程中,worker进程也是需要与master进程交互的,更有甚者,worker进程作为一个子进程,也是可以接收命令行指令(比如kill等)以进行相应逻辑的处理的。那么worker进程是如何与master或者命令行指令进行交互的呢?本文首先会对worker进程与master进程交互方式,以及worker进程如何处理命令行指令的流程进行讲解,然后会从源码上对worker进程交互的整个工作流程进行介绍。      1. worker与master进程交互方式      这里首先需要说明的是,无论是master还是外部命令的方式,nginx都是通过标志位的方式来处理相应的指令的,也即在接收到一个指令(无论是master还是外部命令)的时候,worker会在其回调方法中设置与该指令相对应的标志位,然后在worker进程在其自身的循环中处理完事件之后会依次检查这些标志位是否为真,是则根据该标志位的作用执行相应的逻辑。      对于worker进程与master进程的交互,其是通过socket管道的方式进行的。在ngx_process.h文件中声明了一个ngx_process_t结构体,这里我们主要关注其channel属性:      typedef