在Solaris中,我需要获取特定进程正在使用的IP地址(sshd session),我有他的ID。
他们在linux上如何做到这一点?在读取netstat.c源文件后,这是流程:
迭代位于/ proc/ProcessId/fd /的进程文件描述符,
如果迭代的文件描述符是套接字,它们将读取链接,打开并最终读取文件描述符。检测文件描述符是否是solaris 11.0中的套接字,并提取ip地址
所以在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的
谢谢我将在明天工作..当我试图打开()作为根目录进程的子进程的文件描述符时,它返回-1 – ilansch
* easy *解决方案是类似'popen(“pfiles 1234“,”r);'并且只是解析输出,这样做的好处是不会依赖于没有文档或者稀疏文档的Solaris内部实现,但是性能会降低 –
这个我可以从批处理脚本中完成..但是它不能好,因为pfiles在检查过程中暂停过程。我希望避免暂停,因为我只需要快速读取。 – ilansch