C程序打印自己的地址空间?

C程序打印自己的地址空间?,c,linux,proc,systems-programming,C,Linux,Proc,Systems Programming,我读到cat/proc/[pid]/maps给出了有关其地址空间的信息。 所以我想写一个程序,它将打印自己的地址空间 我的程序是这样的 pid_t pid; int fd; char *buf; pid = getpid(); fd = open("/proc/????/maps", O_RDONLY); 我正在获取PID,但它无法帮助我打开文件。 如何将pid从pid\u t转换为字符串,并将其添加到opencall 或者是否有其他方法打开该文件?所有现代procfs

我读到
cat/proc/[pid]/maps
给出了有关其地址空间的信息。 所以我想写一个程序,它将打印自己的地址空间

我的程序是这样的

  pid_t pid;
  int fd;
  char *buf;

  pid = getpid();

  fd = open("/proc/????/maps", O_RDONLY);
我正在获取PID,但它无法帮助我打开文件。 如何将pid从
pid\u t
转换为字符串,并将其添加到
open
call


或者是否有其他方法打开该文件?

所有现代procfs系统都为正在运行的进程实现了
“/proc/self/”
。只是

fd = open("/proc/self/maps", O_RDONLY);
如果您仍然希望自己创建路径字符串,则必须使用
sprintf

char filename[128];
sprintf(filename, "/proc/%d/maps", getpid());
fd = open(filename, O_RDONLY);

如果您只想打印映射信息以供查看,请使用一种简单的方法:

您可以使用库调用执行
cat/proc/[pid]/maps

一个简单的C代码如下所示:

char command[256];
sprintf(command, "cat /proc/%d/maps", getpid());
system(command);

您可以参考my.

中的一个示例,但我只想使用API's@SGG我不明白这个问题。您想使用什么API?sprintf是c函数。有什么API吗?@SGG-你对API有什么想法?将上述代码粘贴到函数中,添加一些错误检查,然后shazaam,您就有了一个API。@SGG正如我在上面所写的,您最简单的方法就是打开
/proc/self/maps
,它是调用进程的符号链接
/proc/pid
sprintf
函数是C标准的一部分,可以在
stdio.h
中找到。它将与每个
libc
一起提供,其中还包含
open
和您实际读取该文件所需的其他函数。这不会提供早期注释所没有的任何内容。使用system()是一种懒惰和糟糕的形式。效率低下是它的最小问题。它可能受到许多外部因素的影响,这些因素会导致意外行为和副作用,包括更容易被利用。除非你做得对,否则它可能会吃掉你的SIGINT(Ctrl-C)。