在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中做的事情
答案 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服务器,然后接受积压可能会填充导致连接 错误和可能的连接超时错误。
有些选项可以不停止抓取的进程,并将其抓取为只读。