精华内容
下载资源
问答
  • Linux下查看进程打开的文件与打开文件进程
    2021-05-10 16:24:41

    有许多情况下,我们需要查看一个进程当前打开了哪些文件,反过来我们也希望知道某一个文件正在被哪些进程所读写。在Linux下有许多有用的工具可以帮我们完成这两个工作,下面介绍这两个工具:lsof与fuser。

    fuser (find files or sockets' user)

    格式:fuser [选项] fname

    -k 如果找到打开文件的进程,则发送SIGKILL杀死此进程,通过-i选项,可以为用户提供交互选择

    -signal 用户可以指定使用何种信号去kill进程,如果-k参数指定,则忽略此参数

    -m 如果指定一个文件,则所有访问那个文件所在文件系统的进程都会被列出来

    -n  type 指定不同的文件类型,默认类型为file,此外还支持tcp和udp类型,此时可以简写作port/tcp

    -u  显示进程属主

    -v  显示详细进程与打开文件信息

    -4/-6 只搜索IPv4/IPv6套接字

    例如,我们想查看端口TCP端口9000由哪个进程打开 fuser -v -u 9000/tcp

    查看哪些进程在访问/home挂载分区        fuser -mv /home

    lsof (list open file)

    格式:lsof  [选项] [names]

    单独执行lsof将输出系统中所有打开的文件,我们可以grep过滤出我们关心的内容,不过lsof提供了相应的参数帮助我们精确查找

    lsof name 将输出所有使用文件name的进程

    -p pid 列出进程pid所打开的所有文件

    -d FD_pattern 列出所有已经打开的FD值为FD_pattern的文件FD的值有整数,TXT,MEM等等

    -a lsof后可以加多个匹配条件,默认为or连接,此参数将多个条件变成and关系

    -i [46] [proto] [@hostname|ip][:service|port] 用来选择占用某个端口的进程

    +d/+D dir 非递归或递归的显示打开dir下文件的进程

    -c string   显示进程的command中包含string的进程所打开的文件

    -u username 显示属于user的进程所打开的文件

    -g gid

    以上这些参数已经足够用了,上面这两个工具都是读取/proc文件系统中的数据进行工作的。网上有提到借助于lsof的查找功能,可以对一个删除的文件进行恢复,前提是占用这个文件的进程当前还没有关闭。通过被删除的文件,找到对应的进程及在进程中的fd-num,然后通过cat /proc/process-num/fd/fd-num即可恢复被删除的文件。

    更多相关内容
  • 上篇文章Linux内核的源码结构简介(1)简单介绍了Linux内核源码的目录结构,以及和进程的task_struct的几个关键变量,最后提到了在内核里获取当前进程的pid的代码:current->pid。current,属于内核的一个宏,指向...

    上篇文章Linux内核的源码结构简介(1)简单介绍了Linux内核源码的目录结构,以及和进程的task_struct的几个关键变量,最后提到了在内核里获取当前进程的pid的代码:current->pid。

    current,属于内核的一个宏,指向get_current()函数。

    #define current get_current()

    所以代码current,实际是获取get_current()函数的返回值,该返回值的类型是struct task_struct*。

    current,实际获得的是当前进程结构的指针,current->pid ,自然就是当前进程号。

    pid是task_struct的一个成员变量,类型为pid_t,与系统调用getpid()函数的返回值一致。

    下图是Linux内核源码根目录的/include/asm-generic/current.h文件,可以看到current的定义,最终关联的是current_thread_info()函数。

    current_thread_info()的返回值是一个thread_info类型的指针,指针的task成员就是所需的task_struct。

    01ed36ced58fc4ab9fd30110d401a69b.png

    如下的这张图来自arch/arm/include/thread_info.h文件。

    a77485ec8bc5fd38a4ac646ed33f09fe.png

    可以看到current_thread_info()函数就是把current_stack_pointer的低N位清零,然后返回。

    84行的代码说明了,current_stack_pointer就是栈寄存器sp。

    也就是说,在内核里,进程的thread_info结构和进程的栈是绑定在同一组内存页上的,这组内存页的大小和对齐方式取决于THREAD_SIZE(一般是4k或8k,即清零低12位或13位)。

    Linux根目录的include提供的是Linux框架代码,arch目录的include则是cpu平台相关的细节代码,以达到接口和实现的分离。

    虽然据说Linus对C++不怎么待见,但他的设计思路还是oop的:(

    看来没有人不适合写面向对象代码,只是他写的方式与别人不一样。

    614a61af8df0585ea6cf6770cc945ad5.pngia64的实现

    上图是IA64的实现,它使用了r13寄存器保存当前的task_struct,直接把这个值返回就行。

    这里第16行的代码,也说明了汇编里是没有类型的,必须自己记住哪个寄存器里存的是什么,但C是有类型的,在他们对接时要使用类型转换。

    接下来这两张图,来自根目录的kernel/sched/core.c文件。

    046847be3831167a733fe5de37d585d8.png

    schedule()函数就是上图这样,它会调用3450行的__schedule(),在其中会调用下图的context_switch()函数,最终会在2830行使用switch_to()函数切换进程的上下文。

    c8207bd9349154fbbee8d359d9ee5d08.png

    switch_to()的具体实现依赖于具体的cpu平台。

    IA64的实现是如下的ia64_switch_to(),可以看到在198行设置了r13寄存器,与该平台上的current实现相对应。

    285cac91ce1d9c1fa3e08b7ca835a717.png

    在我之前介绍fork的文章Linux的fork()系统调用里提过,fork只是创建一个进程的task_struct,实际运行需要调度器的调度。

    第一次运行与之后运行的起始地址略有差异,因为子进程首次运行模拟的是从fork()返回,返回值固定是0。

    在x86上,Linux则简单搞了个percpu变量来记录当前进程的task_struct。

    e0c1549f1179b054a88fc41fc55c034e.png

    percpu变量也是Linux的一个重大改进。

    我们知道,内核的并发是基于CPU的,用户态的并发是基于线程的,如果内核的某个变量只有固定的一个CPU去读写,那么就不需要给它加锁,从而提高效率。

    举报/反馈

    展开全文
  • linux文件读写操作

    2021-03-29 11:11:10
    1.文件编程 进程线程编程 tcp/udp linux文件文件本身包含的数据(打开文件可以看到数据信息) 2.文件属性(元数据:文件的访问权限,文件的大小,创建日期等 ) 目录也是文件之一(当创建一个新的目录时候,系统...

    1.文件编程 进程线程编程 tcp/udp
    linux文件:文件本身包含的数据(打开文件可以看到数据信息)
    2.文件属性(元数据:文件的访问权限,文件的大小,创建日期等 )
    目录也是文件之一(当创建一个新的目录时候,系统自动创建两个文件项 . 和 …)
    .:当前目录
    …:上一级目录

    /var
    cache:应用程序的缓存文件
    lib:应用程序的信息数据
    local:usr/local中程序的信息
    lock:锁文件
    log:日志文件
    Opt:/opt中程序信息数据
    run:正在执行的信息,PID文件
    tmp:临时文件
    media:文件系统挂载点
    Linux文件类型:
    操作系统:内核:操作系统对于软硬件和系统资源分配的最重要的核心部分
    系统调用:操作系统提供给用户的一组特殊的接口,用户可以通过这组接口来获取操作系统内核提供的服务

    系统命令比API等级更高
    用户编程接口:系统调用并不是直接和程序员进行交互,它仅仅是一个通过软中断机制向内核提交请求,以获取内核服务的接口,在实际使用中程序员调用的通常是用用户编程接口(API)

    文件:
    文件描述符:本质是一个正整数 open函数 0-OPEN-MAX

    man 1 open查命令
    Man 2 open系统调用
    Man 3 open查库函数

    缓冲区:程序中每个文件都可以使用
    磁盘文件->缓冲区->内核(cpu)
    open系列函数:creat:创建文件函数
    Int creat(文件描述符,创建模式)
    创建模式
    S_IRUSR 可读
    S_IWUSR 可写
    S_IXUSR 可执行
    S_IXRWU 可读可写可执行

    Open
    O_RDONLY:以只读方式打开文件
    O_WRONLY:以只写方式打开文件
    O_RDWR:以可读可写的方式打开
    O_CREAT:如果文件存在就打开,如果不存在就创建
    O_APPEND:写文件的时候追加在文件末尾
    出错返回值 -1
    write函数:向文件写入数据
    Write (文件描述符,写入的数据指针,写入的数据内存大小)
    read:从文件读数据
    read(文件描述符,读入某个变量(指针),读出数据大小)

    lseek:用来调整光标的位置
    lseek(文件描述符,光标移动的位置数,光标移动的形式)
    SEEK_SET:将光标移动到文件开头再增加相应的offset位置
    SEEK_CUR:将光标移动到文件的当前位置再往后加offset位置
    SEEK_END:将光标移动到文件的末尾再增加offset的位置
    lseek函数返回值:返回值是从文件开头到光标位置有多少个字符

    ftruncate:将制定的文件大小修改为length指定的大小(用来给文件扩容,如果指定的文件大小小于当前文件,则删除后面的数据)
    ftruncate(int fd,length)
    ftruncate(fd,0)

    展开全文
  • 准备工作1、安装Ipython(请见”Ipython的安装”)2、实验用的文档(你自己用vi编辑器创建文件就好了)一、Python内置的Open函数在Python中,要对应文件进行操作,只要使用内置的Open函数打开文件即可。Open函数接受...

    准备工作

    1、安装Ipython(请见”Ipython的安装”)

    2、实验用的文档(你自己用vi编辑器创建文件就好了)

    一、Python内置的Open函数

    在Python中,要对应文件进行操作,只要使用内置的Open函数打开文件即可。Open函数接受文件名和打开模式作为参数,返回一个文件对象。工程师通过文件对象来操作文件,完成以后,调用文件对象的close方法关闭文件即可。

    例如,在当前目录下有一个名为data的文件,它的内容如下:

    [root@master ~]# cat data

    Beautifulisbetter than ugly.

    Explicitis better than implicit.

    Simpleisbetter than complex.

    Complexis better than complicated.

    接下来,使用Open函数打开文件,调用文件对象的read方法读取文件的所有内容,完成以后,调用文件对象的close方法关闭文件,如下所示:

    In [3]: f = open('data')

    In [4]: print(f.read())

    Beautifulisbetter than ugly.

    Explicitis better than implicit.

    Simpleisbetter than complex.

    Complexisbetter than complicated.

    In [5]: f.close()

    与其他编程语言类似,open函数默认以’r’模式打开,也可以指定文件的打开模式,如表所示。

    表 文件的打开模式

    下面代码分别演示,打开一个不存在的文件时’w’模式与’x’模式的区别:

    In [7]: f = open('data1.txt','w')

    In [8]: f.write('Hello World')

    Out[8]: 11In [9]: f.close()

    In [10]: f = open('data1.txt','x')---------------------------------------------------------------------------FileExistsError Traceback (most recent call last) in

    ----> 1 f = open('data1.txt','x')

    FileExistsError: [Errno17] File exists: 'data1.txt'In [11]:

    In [11]:

    In [11]: f = open('data2.txt','x')

    In [12]: f.write('Hello World')

    Out[12]: 11In [13]:

    In [13]: f.close()

    In [14]:

    二、避免文件句柄泄露

    在计算机程序中,每打开一个文件就需要占用一个文件句柄,而一个进程拥有文件的句柄是有限的。此外,文件句柄也会占用操作系统的资源,因此,在编写程序处理文件时需要注意,文件处理结束后及时关闭文件。文件句柄泄露或许是最常见的资源泄露问题,用finally关闭文件句柄。在Python中,也可以使用finally语句来保证,无论在什么情况下文件都会被关闭,如下所示:

    try:

    f=open(‘data.txt’)

    print(f.read())finally:

    f.close()

    Python中还有更加简洁优美的写法,即使用上下文管理器。虽然使用finally语句能够保证资源一定关闭,但是没有上下文管理器简洁好用。如果工程师可以在上下文管理器的情况下,使用了Finally语句,将会认为代码写的不够Pythonic。对于文件打开、处理、再关闭的逻辑,使用上下文管理器代码如下:

    with open(‘data.txt’) as f:

    print(f.read())

    可以看到,使用上下文管理器以后代码行数变少了。在Python中,如果想想把代码写的简洁优美,就应该在保证可读性的前提下代码行数越少越好。

    三、常见的文件操作函数

    Python的文件对象有多重类型的函数,如刷新缓存的flush函数,获取文件位置的tell函数,改变文件读取偏移量的seek函数。但是,工作中使用最多的还是与读写相关的函数。下面来看几个Python中的读写函数。

    Python提供了三个读相关的函数,分别是read、readline和readlines,他们的作用如下:

    read:读取文件中的所有内容;

    readline:一次读取一行;

    readlines:将文件内容存到一个列表中,列表中的每一行对应于文件中的每一行。

    我们可以使用上边的”data.txt”文件,分别测试这三个读函数的效果:

    In [1]: f = open(‘data.txt’)

    In [2]: f.read()

    Out[2]: ‘Beautiful is better than ugly.\nExplicit is better than implicit.\nSimple is better than complex.\nComplex is better than complicated.\n’

    In [3]: f.seek(0)

    Out[3]: 0

    In [4]: f.readline()

    Out[4]: ‘Beautiful is better than ugly.\n’

    In [5]: f.seek(0)

    Out[5]: 0

    In [6]: f.readlines()

    Out[6]:

    [‘Beautiful is better than ugly.\n’,

    ‘Explicit is better than implicit.\n’,

    ‘Simple is better than complex.\n’,

    ‘Complex is better than complicated.\n’]

    这里可以看到,read和readlines函数都是一次就将所有内容读入内存中,对于文件较小的情况不会有什么问题。但是,如果处理的是大文件,这种使用方法会占用大量的内存,甚至有可能因为内存占用太多出现Out-Of-Memory错误。

    Python提供了两个写函数,分别是write和writelines,他们的区别如下:

    write:写字符串到文件中,并返回写入的字符串;

    writelines:写一个字符串列表到文件中。

    依然使用Ipython对文件对象的写入函数进行测试,并在写入完成以后使用Linux的cat命令查看文件内容:

    In [1]: f = open(‘data.txt’,’w’)

    In [2]: f.write(‘Beautiful is better than ugly.’)

    Out[2]: 30

    In [3]: f.writelines([‘Explicit is better than implicit.’,’Simple is better than complex.’])

    cat data.txt

    在Python中,除了使用文件对象的write函数和writelines函数向文件写入数据以外,也可以使用print函数将输出结果输出到文件中。print函数比write和writelines函数更加灵活,如下所示:

    From __fureture__ import print_function

    With open(‘data.txt’,’w’)as f:

    print(1,2,’hello world’,sep”,”.file=f)

    展开全文
  • 读写文件也需要使用文件描述符来指定待读写的文件。在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file deor)是内核为了高效管理已...
  • 一、现象1)钉钉告警不断,告警如下CPU...3)Linux系统vmstat 1查看系统负载,发现us、sy很高,加起来达到100%。而且,in/cs比平时高出很多。平时都是2000-6000左右,现在跑到10000多4)查看磁盘使用情况发现系统盘在清...
  • fuser功能fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息.fuser显示使用指定文件或者文件系统的进程ID.默认情况下每个文件名后面跟一个字母表示访问类型。...
  • 管道文件、FIFO文件:具有特殊意义的文件,用于进程间通信; 套接字文件:用于网络通信; 所有这些文件都可以用一套API来操作,最基本的四个API是: 打开:open 读文件:read 写文件:write 关闭:close 在使用...
  • 1、基于文件指针的文件操作(缓冲) 文件指针:每打开一个文件,则产生一个对应的流(stream)与之结合,然后产生一个 FILE 类型结构体变量和这个流结合在一起,同时返回一个指向该结构体的指针(FILE*),称为文件指针。...
  • Linux-C-day-5-读写

    2021-05-14 19:32:14
    读写锁当一个进程正在读或者修改某个文件的某个部分时,组织其他进程修改同一个文件或者同一个文件的某个区域。对于Linux来说一切皆是文件,包括IO设备共享内存;接口int fcntl(int fd, int cmd, struct flock *lock...
  • 这里的进程锁与线程锁、互斥锁、读写锁和自旋锁不同,它是通过记录一个PID文件,避免两个进程同时运行的文件锁。 进程锁的作用之一就是可以协调进程的运行,例如crontab使用进程锁解决冲突提到,使用crontab限定每...
  • linux内核中直接读写文件

    千次阅读 2017-03-20 15:37:28
    我们在调试linux内核驱动程序时或者某些特殊场景下,需要直接读写文件,但是我们不适合直接使用系统调用sys_open(),sys_read(),sys_write()等.我们可以利用其它内核函数来实现,filp_open() ,filp_close(), vfs_read()...
  • linux文件IO底层读写操作

    千次阅读 2018-08-24 14:59:04
     运行中的程序成为进程,每个进程都有与之关联的文件描述符。    文件描述符 - 一些小值整数,通过他们访问打开的文件或设备。开始运行会有三个文件描述符: 0: 标准输入 STDIN_FILENO 1: 标准输出 ...
  • linux centos 6.3环境下:(都可以写文件成功,表现为数据交叉写入)第二种情况两个线程都有加锁在windows7环境和linux centos 6.3环境下表现一样:(持有锁的可以写文件成功)多进程同时写一个文件如...
  • Linux内核中读写文件

    万次阅读 2016-07-11 14:13:56
    Linux内核中读写文件数据的方法     有时候需要在Linuxkernel--大多是在需要调试的驱动程序--中读写文件数据。在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() ...
  • linux 打包当前文件夹下所有文件的方法如下所示:tar czvf test.tar.gz * #压缩当前文件夹下非隐藏文件文件tar czvf test.tar.gz .[!.]* #压缩当前文件夹下隐藏文件排除两个隐藏文件夹"."和“..”tar zcvf test....
  • 对于这个实验,结合实验给出的样例,不难分析出需要的几个小知识点:malloc创建缓冲区,open、write、read这三个文件操作函数的使用以及gettimeofday()函数以及时间结构体的使用。 获取时间 时间结构体 struct ...
  • LinuxLinux进程的创建与管理

    万次阅读 多人点赞 2018-07-27 19:21:29
    Linux系统中,除了系统启动之后的第一个进程由系统来创建,其余的进程都必须由已存在的进程来创建,新创建的进程叫做子进程,而创建子进程进程叫做父进程。那个在系统启动及完成初始化之后,Linux自动创建的进程...
  • 一、文件操作的基础 1、操作系统提供的相关API 1).API函数由linux系统提供,由应用层程序调用,来实现各种功能 ...(2)对文件进行读写操作(其他的操作) (3)最后close关闭文件 2、对文件操作的内存情况 1)文件...
  • Linux如何实现进程的调度

    千次阅读 2021-12-13 19:43:39
    文章目录Linux如何实现进程的调度Linux进程的数据结构创建 task_struct 结构Linux 进程地址空间Linux 进程文件Linux 进程调度进程调度实体进程运行队列调度实体和运行队列的关系调度器类Linux 的 CFS 调度器普通...
  • LinuxLinux进程简介及其五种状态

    万次阅读 2018-07-24 21:42:36
    由操作系统定义,并由操作系统所操控的一个特殊的数据结构实例叫做进程。它连接了用户代码,拥有代码运行所需的独立内存空间,在调度器的调度下使用分配给它的处理器时间片来运行。   进程及其私有内存空间 进程...
  • lsof简介lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数...
  • 干货|监控硬盘读写

    2021-05-13 08:00:44
    为了避免硬盘被写满,就需要监控硬盘的使用情况,例如需要感知到系统中写入了哪些文件文件的大小有多少,最好能够跟踪到进程,查看进程打开的文件,并监控此进程读写硬盘的字节数。系统级文件操作监控Linux操...
  • Linux 查看文件被那个进程写数据

    千次阅读 2019-03-15 10:30:42
    Linux 查看文件被那个进程写数据 文件被那个进程使用,写数据不是用lsof可以找出来吗,但现实情况是lsof没找出来T_T 背景 centos7 在某一段时间监控报警磁盘使用率达99%,由于监控属于概要形式信息,没有快照信息的...
  • 程序运行过程中,有读写配置文件保存当前位置信息的操作。在程序运行过程中突然断电,或者异常终止程序,就会出现配置文件内容出错(内容清空)或者文件直接损坏而无法打开的情况。文件损坏时,可能报出segmentation...
  • 5、找进程(大量读写磁盘进程)(最后为英文小写L) iotop ls -l 6、各个进程的链接总数: netstat -aonp | grep tcp |wc -l 7、按照pid看tcp连接数 : netstat -natp|awk '{print $7}'|sort|uniq -c|sort -rn .
  • Python读写文件

    千次阅读 2021-01-15 00:11:42
    给要打开的文件对象指定一个名字,这样可在完成操作之后迅速关闭文件,防止一些无用的文件对象占用内存Python读写文件的五大步骤一、打开文件Python读写文件在计算机语言中被广泛的应用,如果你想了解其应用的程序,...
  • LinuxLinux文件文件的存储

    万次阅读 2018-07-31 18:39:51
    进程的角度来看,文件是一种进程可以对它进行访问的,但独立于进程而存在的数据结构,文件中的信息不会因进程的死亡而消失,除非文件的属主显式地删除它;从操作系统的角度来看,文件是一个逻辑上连续的数据集合,...
  • Linux进程概念

    千次阅读 多人点赞 2022-03-03 08:54:33
    Linux进程概念零、前言一、冯诺依曼体系结构二、操作系统三、进程1、描述进程-PCB2、查看进程3、获取进程标示符4、创建进程-fork()5、进程状态6、僵尸进程7、孤儿进程8、进程优先级9、环境变量1)测试PATH2)测试HOME3...
  • 读写锁(read-write lock)一 综述在一些程序中存在读者写者问题,也就是说,对某些资源的...这个问题模型是从对文件读写操作中引申出来的。读写锁比起mutex具有更高的适用性,具有更高的并行性,可以有多个线程同时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 88,432
精华内容 35,372
关键字:

linux 获取当前进程读写的文件