免费注册 查看新帖 |

Chinaunix

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

请教:如何通过pid获取程序名字?谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-22 18:10 |只看该作者 |倒序浏览
在linux/unix系统的一个进程中,如何通过访问自己的pid来获取该进程所对应的程序的绝对路径名字?
我知道可以通过readlink("/proc/self/exe",...)这个方法可以得到进程自己的名字,那么请问有没有一个系统函数或者库函数,通过自己的pid来获取自己的名字呢?小弟先在此谢谢各位大虾了!

[ 本帖最后由 fufeiwxy 于 2006-6-22 18:12 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-06-22 18:51 |只看该作者
无。

论坛徽章:
0
3 [报告]
发表于 2006-06-22 19:07 |只看该作者
楼上说的很好,没有这样的函数,但有其他方法可以做到。

论坛徽章:
0
4 [报告]
发表于 2006-06-23 14:41 |只看该作者
应该可以做到的,要不然top这样的应用程序如何实现的?
如果在linux下可以遍历/proc下的以数字命名的目录,数字就是pid,里面的符号链结exe就指向可执行文件。

写个脚本也可以利用ps来简单地实现,用system调用下面这句:ps -ef | grep 指定的PID | grep -v grep | perl -e '@value=split(/[\t ]+/,<STDIN>);print @value[7]'

[ 本帖最后由 hezhiroy 于 2006-6-23 14:44 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-06-23 15:14 |只看该作者
如果是读取自己的绝对路径,直接读取当前进程的环境块就行了。如果通过任意一个程序的PId,恐怕有难度吧

论坛徽章:
0
6 [报告]
发表于 2006-06-23 15:48 |只看该作者
总结各位的想法,

这是我写的代码

int
print_my_process_name_by_pid()
{
        pid_t i;
        char buf[32];
        int n;
        char name[128];

        i = getpid();
        strcpy(buf, "/proc/";


        strcat(buf, int_to_str(i));//int_to_str 这是自己实现的
        strcat(buf, "/exe";
        printf("exe is :%s\n", buf);

        n = readlink(buf, name, 12;
        if (n < 0){
                perror("readlink";
                return 3;
        }

        name[n] = '\0';
        printf("my process name is :%s\n", name);

        return 0;
}

欢迎批评指正

论坛徽章:
0
7 [报告]
发表于 2006-06-23 16:59 |只看该作者
先谢谢各位了!
总结一下:
   上面的各种方法基本都用到了proc虚拟文件系统,可是如果想要写一个移植性好的程序,这种方法似乎不怎么好!比如说你的proc文件系统被关闭了!
   对于环境的方法,我也试过,但标准里没有定义这样的一个用来记录程序的绝对路径名的环境表项。
   我想真的就像二楼和三楼说的,没有这样的系统调用或者库函数!

论坛徽章:
0
8 [报告]
发表于 2006-06-23 17:09 |只看该作者
原帖由 fufeiwxy 于 2006-6-23 16:59 发表
先谢谢各位了!
总结一下:
   上面的各种方法基本都用到了proc虚拟文件系统,可是如果想要写一个移植性好的程序,这种方法似乎不怎么好!比如说你的proc文件系统被关闭了!
   对于环境的方法,我也试过,但标 ...

是这样子的,操作系统开发商出于某种目的并不提供这样的接口,我们看到HP-UX/SCO/LINUX/SOLARIS等等,都没有提供这样的接口,相对来说,LINUX还友好一点。
TOP等查看运行信息的命令,大概的方式是通过读取/dev/kmem(或其他名字,根据具体操作系统而不同),然后用一些函数加上和操作系统相关的一些操作来完成的,这样的方式,也是非常不通用的,都是通过具体的操作系统具体方法来做的,有兴趣的可以去搜索一下开源的top,以前我研究过。
另外有些脚本是通过nm/nlist等加上perl等来获取信息的,也行。
总之,没有直接的函数接口,但未必不可获得信息。
大概楼主是想监控操作系统的一些信息吧,推荐2种方式
1、读取系统内存映射,类似top的方式去实现。
2、通过系统提供的命令,加上脚本分析,这样也行。

论坛徽章:
0
9 [报告]
发表于 2006-06-23 17:14 |只看该作者
这是一个监控RS6000 AIX信息的开源代码,有兴趣看看
ftp.funet.fi/pub/unix/AIX/RS6000/monitor-1.12.tar.Z

论坛徽章:
0
10 [报告]
发表于 2006-06-23 17:16 |只看该作者
以下是关键函数

  1. /*
  2. * (C) Copyright 1994, Jussi Maki (Email: jmaki@hut.fi). All rights reserved
  3. * This code is part of AIX monitor program.
  4. * Permission to copy and use this source for noncommersial use.
  5. * For commersial use a permission must be asked from author.
  6. */

  7. #include <unistd.h>
  8. #include <fcntl.h>
  9. #include "getkmemdata.h"

  10. /*********************************************************************/
  11. int getkmemdata(char *buf,int bufsize,caddr_t address)
  12. {
  13.     static int fd;
  14.     static initted = 0;
  15.     int n;
  16.     /*
  17.     ** Do stuff we only need to do once per invocation, like opening
  18.     ** the kmem file and fetching the parts of the symbol table.
  19.     */
  20.     if (!initted) {
  21.         initted = 1;
  22.         fd = open("/dev/kmem", O_RDONLY);
  23.         if (fd < 0) {
  24.             perror("kmem");
  25.             exit(1);
  26.         }
  27.     }
  28.     /*
  29.     ** Get the structure from the running kernel.
  30.     */
  31.     lseek(fd, address, SEEK_SET);
  32.     n = read(fd, buf, bufsize);
  33.     return(n);
  34. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP