金软office激活版:《linux调试工具fuser的深入分析》
来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 08:36:06
概述:
fuser命令可以显示使用文件系统或文件的PID.
##################################################
试验前先建立环境:
mount /dev/sdb1 /mnt/例程如下:
#include
#include
#include
#include
#includeint main ()
{
int fd;
fd = open("/mnt/temp", O_WRONLY|O_SYNC|O_CREAT);
lseek(fd, 80L, SEEK_SET);
sleep(100);
close(fd); return 0;
}编译:
gcc test.c -o test移动test和test.c文件到/mnt/下进行测试##################################################以下的测试将对fuser的六种访问状态进行分析,如下:
c current directory.
e executable being run.
f open file. f is omitted in default display mode.
F open file for writing. F is omitted in default display mode.
r root directory.
m mmap'ed file or shared library.测试1)用fuser显示正在运行的程序,测试ACCESS为e位的情况(executable being run.)终端1)执行test二进制程序
/mnt/test终端2)
fuser -v /mnt/test
USER PID ACCESS COMMAND
/mnt/test: root 2466 ...e. test
注:fuser -v列出/mnt/test程序在运行,同时输出它的PID为2466,ACCESS为e说明它是以一个可执行程序运行的.
##################################################测试2)用fuser显示被只读方式打开的文件,测试ACCESS为f位的情况(open file. f is omitted in default display mode.)终端1)用less打开test.c文件
less /mnt/test.c终端2)
fuser -v /mnt/test.c
USER PID ACCESS COMMAND
/mnt/test.c: root 10546 f.... less注:用less打开的文件,fuser显示它的ACCESS位为f,表示打开的方式是只读的.
##################################################
测试3)用fuser显示被可写方式打开的文件,测试ACCESS为F位的情况(open file for writing. F is omitted in default display mode.)终端1)用vi打开test.c文件
vi /mnt/test.c终端2)
fuser -vm /mnt/
USER PID ACCESS COMMAND
/mnt/: root kernel mount /mnt
root 10488 ..c.. bash
root 10625 F.... vi注:用vi打开的文件,fuser显示它的ACCESS位为F,表示打开的方式为可写.
另外如果用fuser -v /mnt/test.c将看不到输出,因为vi打开的文件实际是/mnt/.test.c.swp,在存盘时才会写到test.c中.
我们也可以用cat > /mnt/test.c的方式进行测试.
##################################################
测试4)用fuser显示的目录是否是用户的当前目录(current directory.)终端1)用cd命令进入/mnt/目录
cd /mnt/终端2)
fuser -vm /mnt/
USER PID ACCESS COMMAND
/mnt/: root kernel mount /mnt
root 3486 ..c.. bash
root 10488 ..c.. bash注:用cd命令进入/mnt/目录,fuser显示它的ACCESS位为c,表示已经有用户正在这个目录下
##################################################
测试5)用fuser显示的目录是否是根目录(root directory)终端1)
切换到普通用户test,并进入到/tmp目录
su - test
cd /tmp
fuser -vm /tmp
USER PID ACCESS COMMAND
/tmp: root kernel mount /
test 11274 .rce. bash注:如果root用户使用fuser -vm /tmp会看到大量的输出,原因是/tmp是根系统系统下挂载的目录.
如果用普通用户test,由于权限的原因,这里只输出了自己的进程.
ACCESS为r说明这个进程用到的目录或文件是根目录下的.如果我们用fuser -vm /mnt/则看不到ACCESS为r的输出,因为它是单独的挂载.
这里我们假设/tmp是根分区系统下的目录,而不是单独的分区.
##################################################
测试6)用fuser显示mmap的文件或是共享lib库的文件的使用信息.(mmap'ed file or shared library.)终端1)创建test2.c源程序,以测试mmap
#include
#include
#include
#include
#include#define ERROR(x) do{ perror(x);exit (EXIT_FAILURE); } while(0)int
main (int argc, char *argv[])
{
const int nbytes = 4096;
void *ptr; int fd = open("/mnt/test2.dat", O_RDWR|O_CREAT);
if (fd == -1) ERROR("open");
ptr = mmap(0, nbytes, PROT_READ|PROT_WRITE,MAP_PRIVATE, fd, 0);
if (ptr == MAP_FAILED) ERROR("mmap"); memset(ptr, 1, nbytes);
sleep(100);
munmap(ptr, nbytes); return 0;
}gcc test2.c -o /mnt/test2
运行/mnt/teset2
/mnt/test2
终端2)
fuser -v /mnt/test2.dat
USER PID ACCESS COMMAND
/mnt/test2.dat: root 11525 F...m test2注:这里我们看到ACCESS位为m,mmap简单的来说就是将文件(/mnt/test2.dat)映射到内存,修改了内存就是修改了文件.我们最后来看一下fuser查看共享库的试验.终端1)
fuser -v /lib/libc.so.6
可以看到用到libc.so.6共享库的进程.
测试7)我们这里用两个简单的用例来做为本文的结束1)杀掉用到/mnt目录的进程fuser -kvm /mnt/注:这里我们最好先用fuser -v /mnt/来查看用到/mnt目录有几个进程,同时我们也可以指定-i参数,来对kill的进程进行提示操作.
同时也可以指定kill发送的信号,例如:
fuser -kvim -HUP /mnt/
USER PID ACCESS COMMAND
/mnt/: root kernel mount /mnt
root 3486 ..c.. bash
Kill process 3486 ? (y/N) y用fuser -l可以列出可以发送的信号2)显示所用用到ssh服务端口的进程fuser ssh/tcp
fuser命令可以显示使用文件系统或文件的PID.
##################################################
试验前先建立环境:
mount /dev/sdb1 /mnt/例程如下:
#include
#include
#include
#include
#include
{
int fd;
fd = open("/mnt/temp", O_WRONLY|O_SYNC|O_CREAT);
lseek(fd, 80L, SEEK_SET);
sleep(100);
close(fd); return 0;
}编译:
gcc test.c -o test移动test和test.c文件到/mnt/下进行测试##################################################以下的测试将对fuser的六种访问状态进行分析,如下:
c current directory.
e executable being run.
f open file. f is omitted in default display mode.
F open file for writing. F is omitted in default display mode.
r root directory.
m mmap'ed file or shared library.测试1)用fuser显示正在运行的程序,测试ACCESS为e位的情况(executable being run.)终端1)执行test二进制程序
/mnt/test终端2)
fuser -v /mnt/test
USER PID ACCESS COMMAND
/mnt/test: root 2466 ...e. test
注:fuser -v列出/mnt/test程序在运行,同时输出它的PID为2466,ACCESS为e说明它是以一个可执行程序运行的.
##################################################测试2)用fuser显示被只读方式打开的文件,测试ACCESS为f位的情况(open file. f is omitted in default display mode.)终端1)用less打开test.c文件
less /mnt/test.c终端2)
fuser -v /mnt/test.c
USER PID ACCESS COMMAND
/mnt/test.c: root 10546 f.... less注:用less打开的文件,fuser显示它的ACCESS位为f,表示打开的方式是只读的.
##################################################
测试3)用fuser显示被可写方式打开的文件,测试ACCESS为F位的情况(open file for writing. F is omitted in default display mode.)终端1)用vi打开test.c文件
vi /mnt/test.c终端2)
fuser -vm /mnt/
USER PID ACCESS COMMAND
/mnt/: root kernel mount /mnt
root 10488 ..c.. bash
root 10625 F.... vi注:用vi打开的文件,fuser显示它的ACCESS位为F,表示打开的方式为可写.
另外如果用fuser -v /mnt/test.c将看不到输出,因为vi打开的文件实际是/mnt/.test.c.swp,在存盘时才会写到test.c中.
我们也可以用cat > /mnt/test.c的方式进行测试.
##################################################
测试4)用fuser显示的目录是否是用户的当前目录(current directory.)终端1)用cd命令进入/mnt/目录
cd /mnt/终端2)
fuser -vm /mnt/
USER PID ACCESS COMMAND
/mnt/: root kernel mount /mnt
root 3486 ..c.. bash
root 10488 ..c.. bash注:用cd命令进入/mnt/目录,fuser显示它的ACCESS位为c,表示已经有用户正在这个目录下
##################################################
测试5)用fuser显示的目录是否是根目录(root directory)终端1)
切换到普通用户test,并进入到/tmp目录
su - test
cd /tmp
fuser -vm /tmp
USER PID ACCESS COMMAND
/tmp: root kernel mount /
test 11274 .rce. bash注:如果root用户使用fuser -vm /tmp会看到大量的输出,原因是/tmp是根系统系统下挂载的目录.
如果用普通用户test,由于权限的原因,这里只输出了自己的进程.
ACCESS为r说明这个进程用到的目录或文件是根目录下的.如果我们用fuser -vm /mnt/则看不到ACCESS为r的输出,因为它是单独的挂载.
这里我们假设/tmp是根分区系统下的目录,而不是单独的分区.
##################################################
测试6)用fuser显示mmap的文件或是共享lib库的文件的使用信息.(mmap'ed file or shared library.)终端1)创建test2.c源程序,以测试mmap
#include
#include
#include
#include
#include
main (int argc, char *argv[])
{
const int nbytes = 4096;
void *ptr; int fd = open("/mnt/test2.dat", O_RDWR|O_CREAT);
if (fd == -1) ERROR("open");
ptr = mmap(0, nbytes, PROT_READ|PROT_WRITE,MAP_PRIVATE, fd, 0);
if (ptr == MAP_FAILED) ERROR("mmap"); memset(ptr, 1, nbytes);
sleep(100);
munmap(ptr, nbytes); return 0;
}gcc test2.c -o /mnt/test2
运行/mnt/teset2
/mnt/test2
终端2)
fuser -v /mnt/test2.dat
USER PID ACCESS COMMAND
/mnt/test2.dat: root 11525 F...m test2注:这里我们看到ACCESS位为m,mmap简单的来说就是将文件(/mnt/test2.dat)映射到内存,修改了内存就是修改了文件.我们最后来看一下fuser查看共享库的试验.终端1)
fuser -v /lib/libc.so.6
可以看到用到libc.so.6共享库的进程.
测试7)我们这里用两个简单的用例来做为本文的结束1)杀掉用到/mnt目录的进程fuser -kvm /mnt/注:这里我们最好先用fuser -v /mnt/来查看用到/mnt目录有几个进程,同时我们也可以指定-i参数,来对kill的进程进行提示操作.
同时也可以指定kill发送的信号,例如:
fuser -kvim -HUP /mnt/
USER PID ACCESS COMMAND
/mnt/: root kernel mount /mnt
root 3486 ..c.. bash
Kill process 3486 ? (y/N) y用fuser -l可以列出可以发送的信号2)显示所用用到ssh服务端口的进程fuser ssh/tcp
《linux调试工具fuser的深入分析》
Linux fork与vfork的11深入分析
linux源代码分析和阅读工具比较
深入分析Linux内核源码——(上)
掌握 Linux 调试技术
LINUX下GDB调试
linux内核调试指南
JavaScript 调试工具 JSDT
Linux系统下常用性能分析工具 top命令详解
linux内核调试指南ea
linux内核调试指南3333
linux下libxml工具的安装 转
深入分析 Linux 内核链表(组图) - C语言技巧讨论 - jiuzhuaxiong
一个值得深入分析的笑话
股市K线图的深入分析
服务器网页缓存的深入分析
一个值得深入分析的笑话
深入分析request_irq的dev_id参数作用
linux下gdb常用的调试命令--by流氓兔斯基
深入理解linux启动过程
linux内核sk_buff的结构分析
详细分析Linux df命令的使用方法
Linux下的实时网络流量监控工具 – iftop
关于开发工具及调试的技术问答 - C8051F之家的博客 - 工控博客