在Solaris中,我需要获取特定进程正在使用的IP地址(sshd会话),我有他的ID。
他们是如何在linux上做到这一点的?阅读netstat.c源代码后,如下所示:
迭代位于/proc/ProcessId/fd/的进程文件描述符,
如果迭代的文件描述符是套接字,则它们重新链接、打开并最终读取文件描述符。
因此,在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(..)他们作为param接收当前上下文进程的文件描述符,我想读取另一个进程的文件描述符。
我可以打开文件描述符并将其转换为struct sockaddr_in吗?
linux和solaris之间的套接字文件描述符结构不同。我想我需要做他们在pfiles / lsof中做的任何事情。
发布于 2017-06-13 13:07:11
我看到了一些方法,如getpeername(..)、getsockname(..)它们作为param接收当前上下文进程的文件描述符,我想读取另一个进程的文件描述符。我可以打开文件描述符并将其转换为struct sockaddr_in吗?
不是的。您可以对其进行open(),并使用文件描述符open()返回,并在所获得的文件描述符上尝试使用getpeername()和getsockname()。也许还能用。
使用pfiles使用的方法可能会为您提供更好的服务。 man page
pfiles 报告每个进程中所有打开的文件的
fstat(2)和fcntl(2)信息。对于网络端点,还提供了本地(以及节点连接的)地址信息,还提供了套接字的、套接字类型、套接字选项以及发送和接收缓冲区大小。此外,如果来自/proc/pid/path的信息可用,则报告文件的路径。这不一定与打开文件所用的名称相同。有关更多信息,请参见proc(4)。
pfiles源代码可在http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/ptools/pfiles/pfiles.c上找到
Solaris提供了一个libproc接口库,可以满足您的需要。pfiles使用它--库提供了诸如pr_getpeername()和pr_getsockname()之类的调用。您可以看到getsockname.c中的实现
请注意,有一些实际的系统调用可以直接从内核获得所需的内容。
打开 Solaris的libproc库手册页可以在http://illumos.org/man/3proc/all上找到,它们很可能与Solaris 11 libproc实现非常相似。
要使用这些工具,你必须非常小心。来自 man page for the function used to grab a process
抓住一个过程是一种破坏性的行为。停止进程将停止其所有线程的执行。停止一个过程的影响取决于该过程的目的。例如,如果一个进程停止了一个主要的计算过程,那么它的计算就会在被停止的整个时间内被延迟。但是,如果这是一个活动的TCP服务器,则accept可能会填充导致连接错误和潜在的连接超时错误。
有一些选项可以不停止抓取进程,并将其捕获为只读。
https://stackoverflow.com/questions/44519894
复制相似问题