免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7488 | 回复: 20
打印 上一主题 下一主题

[请教]如何从pid得到进程的名字,用纯C/C++函数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-26 16:30 |只看该作者 |倒序浏览
小弟问两个问题:
1.例如我有一个可执行程序A
一个库B
A调用B,B里面有一个函数可以得到A的名字并打印出来。

这个函数应该怎么实现呢(c/c++)? 不要用system()去掉用shell的东西。


2.曾经看到过一个BSD的ps的分析,说是能从进程的地址空间中得到argv,这个是则呢没做到的?
以上2个问题没有搜到啊。

谢谢各位大虾的关注!

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
2 [报告]
发表于 2008-06-26 16:37 |只看该作者
linux下可以通过/proc得到

论坛徽章:
0
3 [报告]
发表于 2008-06-26 16:38 |只看该作者
读取/proc/进程号/status   文件的第一行

论坛徽章:
0
4 [报告]
发表于 2008-06-26 16:44 |只看该作者
谢谢楼上的大虾,看见你的帖子数都是5位数了,忽然想起一句话:
路漫漫其修远兮。。。。。。偶继续努力,赶紧破3位数

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
5 [报告]
发表于 2008-06-26 16:45 |只看该作者
原帖由 converse 于 2008-6-26 16:38 发表
读取/proc/进程号/status   文件的第一行

如果这里取得的名字长度等于15
就要从/proc/进程号/cmdline读

论坛徽章:
0
6 [报告]
发表于 2008-06-26 16:47 |只看该作者
小弟学习了!

论坛徽章:
0
7 [报告]
发表于 2008-06-26 16:50 |只看该作者

回复 #5 yecheng_110 的帖子

学到了.
:wink: :wink:

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
8 [报告]
发表于 2008-06-26 16:54 |只看该作者
原帖由 converse 于 2008-6-26 16:50 发表
学到了.
:wink: :wink:

碰巧看killall的源码看到的

论坛徽章:
0
9 [报告]
发表于 2008-06-26 16:57 |只看该作者
向几位大虾学习,有空小弟也多看看源代码

论坛徽章:
0
10 [报告]
发表于 2008-06-26 17:03 |只看该作者
整好想起以前看到的一篇文章,跟这个主题有点联系,顺带介绍一下吧:

案例三:用调试工具掌握软件的工作原理

操作系统:Red Hat Linux 9.0

用调试工具实时跟踪软件的运行情况不仅是诊断软件"疑难杂症"的有效的手段,也可帮助我们理清软件的"脉络",即快速掌握软件的运行流程和工作原理,不失为一种学习源代码的辅助方法。下面这个案例展现了如何使用strace通过跟踪别的软件来"触发灵感",从而解决软件开发中的难题的。

大家都知道,在进程内打开一个文件,都有唯一一个文件描述符(fd:file descriptor)与这个文件对应。而本人在开发一个软件过程中遇到这样一个问题:已知一个fd ,如何获取这个fd所对应文件的完整路径?不管是Linux、FreeBSD或是其它Unix系统都没有提供这样的API,怎么办呢?我们换个角度思考:Unix下有没有什么软件可以获取进程打开了哪些文件?如果你经验足够丰富,很容易想到lsof,使用它既可以知道进程打开了哪些文件,也可以了解一个文件被哪个进程打开。

好,我们用一个小程序来试验一下lsof,看它是如何获取进程打开了哪些文件。

/* testlsof.c */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
        open("/tmp/foo", O_CREAT|O_RDONLY);    /* 打开文件/tmp/foo */
        sleep(1200);                                /* 睡眠1200秒,以便进行后续操作 */
        return 0;
}


将testlsof放入后台运行,其pid为3125。命令lsof -p 3125查看进程3125打开了哪些文件,我们用strace跟踪lsof的运行,输出结果保存在lsof.strace中:

# gcc testlsof.c -o testlsof
# ./testlsof &
[1] 3125
# strace -o lsof.strace lsof -p 3125


我们以"/tmp/foo"为关键字搜索输出文件lsof.strace,结果只有一条:

# grep '/tmp/foo' lsof.strace
readlink("/proc/3125/fd/3", "/tmp/foo", 4096) = 8


原来lsof巧妙的利用了/proc/nnnn/fd /目录(nnnn为pid):Linux内核会为每一个进程在/proc/建立一个以其pid为名的目录用来保存进程的相关信息,而其子目录fd保存的是该进程打开的所有文件的fd。目标离我们很近了。好,我们到/proc/3125/fd/看个究竟:

# cd /proc/3125/fd/
# ls -l
total 0
lrwx------    1 root     root           64 Nov  5 09:50 0 -> /dev/pts/0
lrwx------    1 root     root           64 Nov  5 09:50 1 -> /dev/pts/0
lrwx------    1 root     root           64 Nov  5 09:50 2 -> /dev/pts/0
lr-x------    1 root     root           64 Nov  5 09:50 3 -> /tmp/foo
# readlink /proc/3125/fd/3
/tmp/foo


答案已经很明显了:/proc/nnnn/fd/目录下的每一个fd文件都是符号链接,而此链接就指向被该进程打开的一个文件。我们只要用readlink()系统调用就可以获取某个fd对应的文件了,代码如下:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
int get_pathname_from_fd(int fd, char pathname[], int n)
{
        char buf[1024];
        pid_t  pid;
        bzero(buf, 1024);
        pid = getpid();
        snprintf(buf, 1024, "/proc/%i/fd/%i", pid, fd);
        return readlink(buf, pathname, n);
}
int main(void)
{
        int fd;
        char pathname[4096];
        bzero(pathname, 4096);
        fd = open("/tmp/foo", O_CREAT|O_RDONLY);
        get_pathname_from_fd(fd, pathname, 4096);
        printf("fd=%d; pathname=%s\n", fd, pathname);
        return 0;
}


【注】出于安全方面的考虑,在FreeBSD 5 之后系统默认已经不再自动装载proc文件系统,因此,要想使用truss或strace跟踪程序,你必须手工装载proc文件系统:mount -t procfs proc /proc;或者在/etc/fstab中加上一行:

proc                   /proc           procfs  rw              0       0


ltrace不需要使用procfs。


http://www.ibm.com/developerworks/cn/linux/l-tsl/index.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP