lsof
lsof 文件名
查看某个文件被哪些进程在读写
lsof -c 进程名 lsof -p进程号
查看某个进程打开了哪些文件
lsof用法小结
lsof abc.txt 显示开启文件abc.txt的进程
lsof -i :22 知道22端口现在运行什么程序
lsof -c nsd 显示nsd进程现在打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof -d 4 显示使用fd为4的进程
lsof -i [i] 用以显示符合条件的进程情况
例如:
通过某进程显示该进程打开的文件
sudi lsof -p 1 查看进程号是1的进程打开的文件
列出某个程序所打开的文件信息
sudo lsof -c mysql
#测试哪个进程使用端口
sudo lsof -i :3306用来测试某个端口是否被占用
查看程序运行相关的信息
sudo ls /proc
#1号进程使用的描述符
sudo ls /proc/1/fd
mmap
内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。
注意:
mmap并不分配空间, 只是将文件映射到调用进程的地址空间里(但是会占掉你的 virutal memory)
mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
mmap1.c
写入如下代码:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/mman.h>
void sys_err(char *s)
{
perror(s);
exit(1);
}
int main(int argc, char** argv)
{
if (argc < 2)
{
printf("usage: mmap1 filename\n");
return 1;
}
int fd;
fd = open(argv[1], O_RDWR);
if (fd < 0)
{
sys_err("open");
}
//get file length
off_t len;
len = lseek(fd, 0, SEEK_END);
void* mem;
mem = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);
//#define MAP_FAILED ((void*)-1)
if (mem == MAP_FAILED)
{
sys_err("mmap");
}
close(fd);
printf("%s\n", mem);
*(char*)mem = 'Z';
*(char*)(mem + 1) = 'X';
if (-1 == munmap(mem, len))
{
sys_err("munmap");
}
return 0;
}
执行如下命令:
mmap2.c修改文件内容
写入如下代码:
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <error.h>
int main(int argc, char **argv)
{
int fd, nread, i;
struct stat sb;
char *mapped;
if (argc <= 1)
{
printf("%s: Need file path! \n", argv[0]);
exit(-1);
}
/*打开文件*/
if ((fd = open(argv[1], O_RDWR)) < 0)
{
perror("open");
}
/*获取文件的属性*/
if ((fstat(fd, &sb)) == -1)
{
perror("fstat");
}
/*将文件映射至进程的地址空间*/
if ((mapped = (char *)mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == (void *)-1)
{
perror("mmap");
return -1;
}
/*映射完后, 关闭文件也可以操纵内存*/
close(fd);
printf("%s", mapped);
/*修改一个字符,同步到磁盘文件*/
mapped[0] = '0';
if ((msync((void *)mapped, sb.st_size, MS_SYNC)) == -1)
{
perror("msync");
}
/*释放存储映射区*/
if ((munmap((void *)mapped, sb.st_size)) == -1)
{
perror("munmap");
}
return 0;
}
执行如下命令:
文件的特殊权限位
-rwsrw-r–
例如: