检测文件描述符是否为solaris 11.0中的套接字并提取IP地址

时间:2017-06-13 11:10:52

标签: c linux solaris netstat

在Solaris中,我需要获取特定进程正在使用的IP地址(sshd session),我有他的ID。
他们是如何在linux上做的?在阅读netstat.c源代码后,这就是流程:
迭代位于/ proc / ProcessId / fd /,
的过程文件描述符 如果迭代文件描述符是套接字,则它们是readlink,open并最终读取文件描述符。

所以在solaris中,我可以检测进程的套接字文件描述符。

int fd=NULL;
struct dirent *dentp;
while ((dentp = readdir(dirp)) != NULL) { //iterate file descriptors
   fd = atoi(dentp->d_name);
   struct stat statb;
   char temp_dir_path [100];
   if (stat(temp_dir_path, &statb) != -1)
   {
       if (S_ISSOCK(statb.st_mode))
       {
         //What to do here ?? temp_dir_path is /proc/12345/fd/4

我看到有像getpeername(..),getsockname(..)这样的方法,它们作为参数接收当前上下文进程的文件描述符,我想读取另一个进程的文件描述符。
我可以打开文件描述符并将其转换为struct sockaddr_in吗?

套接字文件描述符结构在linux和solaris之间有所不同。我想我需要做任何他们在pfiles / lsof中做的事情

1 个答案:

答案 0 :(得分:2)

  

我看到有像getpeername(..),getsockname(..)这样的方法,它们作为参数接收当前上下文进程的文件描述符,我想读取另一个进程的文件描述符。   我可以打开文件描述符并将其转换为struct sockaddr_in吗?

没有。您可以open()并使用文件描述符open()返回并尝试在您获得的文件描述符上使用getpeername()getsockname()。它甚至可能有效。

使用pfiles方法使用的方法可能会更好。 Per the pfiles man page

  

PFILES

     

报告所有打开文件的fstat(2)fcntl(2)信息   每个过程。 对于网络端点,本地(和对等的if   连接)也提供地址信息。对于套接字,   套接字类型,套接字选项以及发送和接收缓冲区大小也是   提供。此外,如果是,则报告文件的路径   信息可从/ proc / pid / path获得。这不一定   用于打开文件的相同名称。有关更多信息,请参阅proc(4)。

可以在http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/ptools/pfiles/pfiles.c

找到pfiles源代码

Solaris提供了一个libproc接口库,可以满足您的需求。 pfiles使用该功能 - 该库提供pr_getpeername()pr_getsockname()等调用。您可以在http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libproc/common/pr_getsockname.c

中查看实施

请注意,实际的系统调用可直接从内核获取所需内容。

<{1}}库的打开 Solaris手册页可以在http://illumos.org/man/3proc/all找到。它们可能与Solaris 11 libproc实现大致相似。

要使用这些工具,您必须非常小心。来自the Pgrab man page for the function used to grab a process

  

抓住一个过程是一种破坏性行为。停止进程停止   执行其所有线程。停止过程的影响取决于   就这个过程而言。例如,如果停止进程   那主要是做计算,然后计算延迟了   它停止的整个时间。但是,如果相反,这是一个   活动的TCP服务器,然后接受积压可能会填充导致连接   错误和可能的连接超时错误。

有些选项可以不停止抓取的进程,并将其抓取为只读。