精华内容
下载资源
问答
  • 我想删除linux上的文件,在删除之前想判断文件...看到有人数如果文件不能独占被打开,就说明文件已经被调用,但是ChannelSftp也没有独占打开文件的方法,连普通的open方法都没有。有点茫然了。有大神知道怎么解决吗?
  • 今天工作sever 上的/home目录下磁盘空间满了,找到大文件,用rm ...linux命令 — lsof 查看进程打开那些文件 或者 查看文件给那个进程使用 lsof命令是什么? 可以列出被进程所打开文件的信息。被打开文件可以是

     今天工作sever 上的/home目录下磁盘空间满了,找到大文件,用rm 发现删不了,原来有进程占用了它。

    那如何知道到底是哪一个进程占用了这个文件呢?用

    2. 查看谁正在使用某个文件

    lsof   /filepath/file

    linux命令 — lsof 查看进程打开那些文件 或者 查看文件给那个进程使用

    lsof命令是什么?

    可以列出被进程所打开的文件的信息。被打开的文件可以是

    1.普通的文件,2.目录  3.网络文件系统的文件,4.字符设备文件  5.(函数)共享库  6.管道,命名管道 7.符号链接

    8.底层的socket字流,网络socket,unix域名socket

    9.在linux里面,大部分的东西都是被当做文件的…..还有其他很多

    怎样使用lsof

    这里主要用案例的形式来介绍lsof 命令的使用

    1.列出所有打开的文件:

    lsof

    备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位

    2. 查看谁正在使用某个文件

    lsof   /filepath/file

    3.递归查看某个目录的文件信息

    lsof +D /filepath/filepath2/

    备注: 使用了+D,对应目录下的所有子目录和文件都会被列出

    4. 比使用+D选项,遍历查看某个目录的所有文件信息 的方法

    lsof | grep ‘/filepath/filepath2/’

    5. 列出某个用户打开的文件信息

    lsof  -u username

    备注: -u 选项,u其实是user的缩写

    6. 列出某个程序所打开的文件信息

    lsof -c mysql

    备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符了

    7. 列出多个程序多打开的文件信息

    lsof -c mysql -c apache

    8. 列出某个用户以及某个程序所打开的文件信息

    lsof -u test -c mysql

    9. 列出除了某个用户外的被打开的文件信息

    lsof   -u ^root

    备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示

    10. 通过某个进程号显示该进行打开的文件

    lsof -p 1

    11. 列出多个进程号对应的文件信息

    lsof -p 123,456,789

    12. 列出除了某个进程号,其他进程号所打开的文件信息

    lsof -p ^1

    13 . 列出所有的网络连接

    lsof -i

    14. 列出所有tcp 网络连接信息

    lsof  -i tcp

    15. 列出所有udp网络连接信息

    lsof  -i udp

    16. 列出谁在使用某个端口

    lsof -i :3306

    17. 列出谁在使用某个特定的udp端口

    lsof -i udp:55

    特定的tcp端口

    lsof -i tcp:80

    18. 列出某个用户的所有活跃的网络端口

    lsof  -a -u test -i

    19. 列出所有网络文件系统

    lsof -N

    20.域名socket文件

    lsof -u

    21.某个用户组所打开的文件信息

    lsof -g 5555

    22. 根据文件描述列出对应的文件信息

    lsof -d description(like 2)

    23. 根据文件描述范围列出文件信息

    lsof -d 2-3

     

    展开全文
  • 当多个用户共同使用、操作一个文件的时候,linux通常采用的方法是给文件上锁,来避免共享资源产生竞争的状态。 文件锁按功能分为 共享读锁 文件描述符必须读打开 一个进程上了读锁,其它进程也可以上读...

    目录

    高级文件操作-文件锁

    文件锁按功能分为

    fcntl函数

    flock结构体

    加锁和解锁区域的注意

    锁的继承与释放

    案例一

    案例二


    高级文件操作-文件锁

    • 当多个用户共同使用、操作一个文件的时候,linux通常采用的方法是给文件上锁,来避免共享资源产生竞争的状态

    文件锁按功能分为

    共享读锁
    • 文件描述符必须读打开
    • 一个进程上了读锁,其它进程也可以上读锁进行读取
    独占写锁
    • 文件描述符必须写打开
    • 一个进程上了写锁,其它进程就不能上写锁和读锁进行读写操作
    • 文件锁按类型分为建议性锁和强制性锁。
      • 建议性锁要求上锁文件的进程都要检测是否有锁存在,并尊重已有的锁。
      • 强制性锁由内核和系统执行的锁。
    • fcntl不仅可以实施建议性锁而且可以实施强制性锁。

    fcntl函数

    #include <unistd.h>
    #include <fcntl.h>
    int fcntl(int fd, int cmd, struct flock *lock);
    cmd: F_SETLK、F_GETLK 和 F_SETLKW

    flock结构体

    l_type
    • 锁类型,F_RDLCK(共享读锁)、F_WRLCK(独占性写锁)或F_UNLCK(解锁一个区域)
    l_start、l_whence
    • 要加锁或解锁的区域的起始地址,由l_start和l_whence 两者决定
    • l_start是相对位移量,l_whence则决定相对位移量的起点。
    l_len
    • 表示区域的长度

    加锁和解锁区域的注意

    • 该区域可以在当前文件尾端处开始或越过其尾端处开始,但是不能在文件起始位置之前开始或越过该起始位置。
    • 如若l_len为0,则表示锁的区域从其起点(由l_start和l_whence决定)开始直至最大可能位置为止
      • 也就是不管添写到该文件中多少数据,它都处于锁的范围。
    • 为了锁整个文件,通常的方法是将l_start设为0,l_whence设为SEEK_SET,l_len设为0。

    锁的继承与释放

    • 一个进程终止,它所建立的锁全部释放
    • 关闭一个文件描述符,此进程对应该文件的所有的锁均释放。
    • 子进程不继承父进程的锁
    • 执行exec以后,新程序可以选择是否继承原来执行进程的锁。

    案例一

    • io.h
    #ifndef _IO_H_
    #define _IO_H_
    #include <sys/types.h>
    //...
    
    extern int lock_reg(int fd, int cmd, short type , off_t offset, short whence, off_t length);
    
    #define READ_LOCKW(fd, offset, whence, length) \
    		lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, length)
    #define READ_LOCK(fd, offset, whence, length) \
    		lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, length)
    #define WRITE_LOCKW(fd, offset, whence, length) \
    		lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, length)
    #define WRITE_LOCK(fd, offset, whence, length) \
    		lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, length)
    #define UNLOCK(fd, offset, whence, length) \
    		lock_ reg(fd, F_SETLK, F_UNLCK, offset, whence, length)
    
    #endif
    
    • io.c部分代码
    //...
    int lock_reg(int fd, int cmd, short type, off_t offset, short whence, off_t length)
    {
    	struct flock flock;
    	flock.l type = type;
    	flock.l_start = offset;
    	flock.l_whence = whence;
    	flock.l_len = length;
    	//flock.t_pid = getpid();
    	//l_pid:加锁、解锁进程的进程号(pid)
    	if(fcntl(fd, cmd, &flock)< 0){
    	    perror("fcntl error");
    	    return 0;
    	}
    	return 1;
    )
    • 编译
    gcc -o obj/io.o -Iinclude -c src/io.c
    • 调用
    int main(int argc,char* argv[]){
    	if(argc < 4){
    		printf("usage:%S content file locktype\n", argv[0]);
    		exit(1);
    	}
    	ssize_t size = strlen(argv[1]) * sizeof(char);
    	int fd = open(argv[2],0_WRONLY | 0_CREAT,0777);
    	if(fd < 0){
    		perror("open error");
    		exit(1);
    	}
    	//第二个进程想要对文件加文件锁(这里是独占写锁)
    	//必须要等前一个进程释放了文件锁后方可加锁.
    	if(!strcmp("lock", argv[3]))
    		WRITE_LOCKW(fd, 0, SEEK_SET, 0);
    	printf("lock success\n");
    	printf("lock pid:%d\n", getpid());
    	sleep(5); 
    	if(!strcmp("lock", argv[3]))
    		WRITE_LOCKW(fd, 0, SEEK_SET, 0); 
    	printf("lock success\n"); 
    	printf("lock pid: %d\n", getpid()); 
    
    	char *p = argv[1]; 
    	int i; 
    	for(i = 0; i < size; i++){
    		if (write(fd, (p+i), 1)!= 1){
    		perror("write error"); 
    		exit(1);
    	}
    	printf("%d success write one character\n", getpid()); 
    	sleep(1); 
    	}
    	if(!strcmp("unlock", argv[3]))
    	    UNLOCK(fd, 0, SEEK_SET, 0);
    	printf ("unlock success\n"); 
    	printf("unlock pid: %d\n", getpid()); 
    
    	close(fd); 
    	return 0;
    }
    • 编译
    gcc -o bin/lock_write -Iinclude obj/io.o src/lock_write.c
    • 编写start.h脚本文件
    bin/lock_write aaaaaa demo.txt Lock &
    bin/Lock_write AAAAAA demo.txt lock &
    
    • 运行结果

    • 改变脚本如下
    bin/lock_write aaaaaa demo.txt Lock &
    bin/Lock_write AAAAAA demo.txt unlock &
    
    • 运行结果(第二个进程关闭了文件锁,没有锁时,由于这里的文件锁是建议性锁,所以能继续向文件中输入数据,出现交替输入的情况)

    案例二

    int main(int argc, char *argv[]){
    	if(argc < 4){
    		printf("usage: %S content file lock I unlock\n" , argv[0]); 
    		exit(1); 
    		}
    		ssize_ t size = strlen(argv[1]) * sizeof(char); 
    		int fd = open(argv[2], 0_ WRONLY| 0_CREAT, 0777); 
    		if(fd < 0){
    			perror("open error"); 
    			exit(1) ;
    		}
    	char *p = argv[1]; 
    	int i; 
    	for(i = 0; i < size; i++){
    		if (write(fd, (p+i), 1) != 1){
    			perror("write error"); 
    			exit(1);
    		}
    		printf("%d success write one character\n", getpid()); 
    		sleep(1);
    	}
    	sleep(5);
    	printf("current pid:%d\n", getpid());
    	if(!strcmp("'lock", argv[3])){
    		//加文件锁(这里是独占写锁)
    		//第二个进程想要对文件加锁必须要等到
    		//第一个进程释放文件锁后方可枷锁.
    		WRITE_LOCKW(fd, 0, SEEK_SET, 0);
    		printf("lock success\n");
    	}
    	if(!strcmp("lock", argv[3])){
    		UNLOCK(fd, 0, SEEK_SET, 0);
    		printf("unlock success\n");
    		printf("unlock pid:%d\n", getpid());
    	}
    	close(fd);
    	return 0;
    }
    • 编写start.h脚本文件
    bin/lock_write aaaaaa demo.txt Lock &
    bin/Lock_write AAAAAA demo.txt lock &
    

    • 改变脚本如下(由于这里的文件锁是建议性锁,不加锁也能向文件中写入数据)
    bin/lock_write aaaaaa demo.txt Lock &
    bin/Lock_write AAAAAA demo.txt unlock &
    

    展开全文
  • 本来不准备开电脑了,太困了,想睡觉,然而一哥们儿短信都发过来了,要问个问题,于是还是打开了电脑,没想到是一个很有代表性的问题,顺便也牵扯了前些天我的工作中的一个bug,值得...下面的讨论都是基于独占打开的模
  • 打开电脑后C盘安装的很多软件都没有了,不过没有安装在c盘的软件是在的,不过我的vmware打开遇到了一些问题,显示以独占方式锁定此配置文件失败,我安装了10个左右的linux系统,奇怪的是有些能打开有一些不能,我把...

    关于vmware提示Vmware提示以独占方式锁定此配置文件失败

    场景:win10计算机因为异常不得不保存文件更新电脑系统,打开电脑后C盘安装的很多软件都没有了,不过安装在其他盘的软件是在的,不过打开vmware打开遇到了一些问题,显示以独占方式锁定此配置文件失败,我安装了10个左右的linux系统,奇怪的是有些能打开有一些不能,我把正常的软件关闭后,从新打开也异常了。我在网上找了一下解决的方案,大概有三种。

    1:杀vmware进程,把何vmware相关进程全部杀掉,不过没有解决问题

    2:删除vmware临时文件,后重启电脑,这个方法有用不过奇怪的是部分虚拟机仍然打不开

    3:关闭vmware,再重启服务,具体方法参照这里:https://www.cnblogs.com/shenzhenhuaya/p/sfaegtrg.html。。。。一顿操作猛如虎,的确很明显解决问题了,不过,不过还是没有彻底解决,关了虚拟机之后再打开还是有问题,感觉可能是vmware有问题,于是重装了vmware果真彻底解决问题了,顺带提醒一句在寻找问题的时候,有人说虚拟机不用的时候尽量挂着,而不要直接关闭

    展开全文
  • man flock 函数例子:FILE * fp;fp = fopen("test.txt","r+");if( flock(fileno(fp),LOCK_EX) != -1 ){ // 成功加独占锁!}上面没有加冗错机制,你自己做了,顺便说一下如果你 fclose(fp); 之后锁就会自动释放
    man flock 函数
    例子:
    FILE * fp;
    fp = fopen("test.txt","r+");
    if( flock(fileno(fp),LOCK_EX) != -1 )
    {
        // 成功加独占锁!
    }
    上面没有加冗错机制,你自己做了,顺便说一下如果你 fclose(fp); 之后锁就会自动释放
    展开全文
  • 原子操作:将一次系统调用所需要的各个动作作为不可中断的操作,一次性加以执行。 原子操作是许多系统调用得以正确执行的必要条件。...试图以独占方式打开文件的错误代码: 当两个进程在一个多CPU系统上同时运...
  • 这个状态包括存放在存储器中的程序的代码,数据,栈,通用目的寄存器的内容,程序计数器,环境变量,以及打开文件描述符的集合.  进程可以抽象为 一个独立的逻辑控制流 它提供假象,好像我们的程序独占地使用...
  • elf签名和可执行文件签名

    千次阅读 2010-02-09 17:54:00
    linux之所以容易清除病毒前面有文章谈过,就是说它可以随时删除文件,linux的文件管理没有和用户的任何策略胶合在一起,就是说打开文件的方式没有独占方式,所谓独占就是和用户的胶合,打开应该仅仅有文件的属性才对...
  • Linux进程

    2017-05-16 20:17:00
    进程上下文包括:存放在内存中的代码和数据,进程的栈、通用目的寄存器值、程序计数器、环境变量以及打开文件描述符的集合。 进程 进程未应用程序提供两个重要的抽象: 一个独立的逻辑控制流,它提供一个假象——...
  • linux 进程

    2019-01-18 20:52:09
    进程:运行中的程序(打开文件,挂起的信号,内存,执行线程等等) 线程(pc,寄存器(线程需记录cpu寄存器的值,以挂起后恢复执行),栈),调度对象,在liux里是特殊进程 虚拟处理器/内存:让进程觉得自己独占...
  • Linux多线程

    2019-09-03 16:58:14
    进程的概念:进程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的...每个线程完成不同的任务,但是共享同一地址空间,打开文件队列和其他内核资源。 线程与进程的区别: (1)一个线...
  • 当多个控制线程共享相同的内存时呢,需要确保每个线程看到一致的数据...下面程序存在竞争问题的哟,当创建20个线程,每个线程都对同一个文件进行读写操作,有可能发生N个线程同时对文件进行打开和读操作,在写的过程...
  • linux 多线程(2)

    2020-05-31 10:51:45
    Linux多线程编程 linux的C语言中,线程与进程的对比 线程:标识符类型,pthread_t;获取ID,pthread_self();创建,pthread_create()...包括 1)可执行命令,2)静态数据:全局变量,3)进程中打开文件描述符,4)当前工作
  • 1、Linux中进程即为正在执行的程序代码的实时结果,包括打开文件、挂起的信号、内核内部的数据、处理器状态、映射的内存地址空间、执行线程、数据段……; 2、进程的2种虚拟机制:虚拟处理器+虚拟内存。将共用的...
  • server时,因为下载时不知什么原因卡住不动了,半天没有反应,所以直接关机重启了一下,但是当在打开时,提示以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件。 尝试着用任务管理器...
  • 当多个用户使用、操作一个文件的时候... 独占写锁:文件描述符必须写打开 一个进程上了写锁,其他进程不能上写锁和读锁进行读写操作 文件锁按类型分为建议锁和强制性锁。建议性锁要求上锁文件的进程都要检测是否有...
  • VirtualBox解决鼠标独占和全屏问题

    千次阅读 2010-05-08 23:26:53
    1、在VirtualBox的安装目录下有一个VBoxGuestAdditions.iso文件打开它 安装里面相应的文件(根据宿主机是xp或者linux有所不同) 2、当在主界面运行你的虚拟机后会有一个新窗口运行虚拟机,在这个窗口的 Devices...
  • 一.vim编辑文件时可以实现单词自动补全吗? vim自动补全的功能请尝试ctrl-n 二.vim编辑器可以打开多个窗口吗? vim在终端中执行,并且在执行时独占整个终端,但是在vim内部,你却可以...
  • Linux网络编程 宋敬彬 孙海滨

    热门讨论 2011-12-09 16:49:20
    3.2.2 打开创建文件open()、create()函数 72 3.2.3 关闭文件close()函数 76 3.2.4 读取文件read()函数 77 3.2.5 写文件write()函数 79 3.2.6 文件偏移lseek()函数 80 3.2.7 获得文件状态fstat()函数 83 3.2.8 文件...
  • 三个硬链接 指向同一个inode,文件删除的 unlink的时候 实际上删除的是这三个目录项的其中一个,文件实际并没有删除, ...①父子进程共享打开文件 ②父子进程共享mmap建立得映射区,但必须使用MAP_SHARED ...
  • 3.2.2 打开创建文件open()函数、create()函数 73 3.2.3 关闭文件close()函数 76 3.2.4 读取文件read()函数 77 3.2.5 写文件write()函数 79 3.2.6 文件偏移lseek()函数 80 3.2.7 获得文件状态fstat()函数 83 ...
  • 而线程被认为是进程中的具体执行流,共享进程的地址空间和打开文件描述符。对于进程,核心是两个虚拟机制: 虚拟处理器:内核为进程提供这样一种抽象,每个进程独享处理器。 虚拟内存:内核为每个进程提供私有...
  • 系统调用文件IO存在线程安全的问题,当多个用户共同使用、操作一个文件的时候,Linux 通常采用的方法是给文件上锁,来避免共享资源产生竞争的状态。 文件锁可以分为共享读锁和独占写锁。共享读锁:文件必须使用只读...
  • 1.5.2 Linux文件结构................................................ 9 1.6 G N U 通用公共许可证..................................................10 1.6.1 G P L许可证的历史...............................

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
热门标签
关键字:

linux独占打开文件

linux 订阅