如何以编程方式获取正在侦听某个端口的进程的 pid?

Posted

技术标签:

【中文标题】如何以编程方式获取正在侦听某个端口的进程的 pid?【英文标题】:How to get the pid of a process that is listening on a certain port programmatically? 【发布时间】:2012-06-15 07:27:22 【问题描述】:

我必须编写一个 SNMP 模块来监控我也编写的某个服务器应用程序。问题是我必须知道这个应用程序是否正在运行,并且我应该能够尽可能地杀死它。

我知道应用程序正在侦听的端口(读取应用程序配置文件),我可以尝试将此端口绑定到套接字,以了解我的应用程序或其他应用程序是否正在使用它这对我的模块来说已经足够了。代码如下:

int
get_server_status()

        struct sockaddr_in local;
        int port,sockfd;

        if (parse_config_file(&port,NULL,CONFIG_FILE_PATH) == -1)
                return -1; //Error

        if ((sockfd = socket ( AF_INET, SOCK_STREAM, 0 )) < 0)
                return -1; //Error

        local.sin_family = AF_INET;
        local.sin_port = htons ( port );
        local.sin_addr.s_addr = inet_addr ("127.0.0.1");

        if (bind(sockfd, (struct sockaddr *) &local, sizeof (local) ) < 0 )
                if(errno == EADDRINUSE)
                        return 1; //Port being used
                else
                        return -1; //Error
        else
                close(sockfd);
                return 0;         //Port not being used

        

当我需要杀死应用程序时,问题就来了,我既不知道它的PID 也不知道如何获取它。我可以使用netstat -tln &lt;port&gt;,但我不知道如何以编程方式进行。有什么想法吗??

【问题讨论】:

为什么不看看netstat的代码? 我做了一些类似的。我用过strace,我发现netstat打开/proc/net/tcp但我不知道如何从那里获取pid。 【参考方案1】:

当然,你可以 fork netstat,或者做 netstat 所做的事情(我假设你正在使用某种 unix):

/proc/net/tcp 'file' 显示当前的 tcp 套接字。每行都提供有关套接字的信息。 local_address 字段以 IP:PORT 格式以十六进制显示本地地址。从那里您可以找到与侦听端口对应的套接字。然后你得到对应的inode文件,你应该在所有/proc//fd链接中搜索它,格式为

-> 套接字:[]

希望对你有帮助

【讨论】:

【参考方案2】:

netstat,你应该读/proc/net/tcp

解读:

    第二个字段,标题为local_address,是IP 和端口。 00000000:0050 将是 HTTP(端口号为十六进制)。 第四个字段,标题为st,是状态。 ATCP_LISTEN。 第 10 个字段,标题为 inode 是 inode 编号(这次是十进制)。 对于每个进程,/proc/pid/fd/ 包含每个打开文件描述符的条目。套接字描述符的ls -l 表明它是指向socket:[nnnnnn] 的链接。编号 nnnnnn 应与来自 /proc/net/tcp 的 inode 编号匹配。

这使得查找过程相当烦人,但可能。 在/proc/net/tcp中找到正确的行并不难,然后就可以得到inode号了。 查找进程需要您扫描所有进程,查找引用此 inode 编号的进程。我没有更好的办法。

【讨论】:

以上是关于如何以编程方式获取正在侦听某个端口的进程的 pid?的主要内容,如果未能解决你的问题,请参考以下文章

使用 IPC 如何告诉客户端服务器正在侦听哪个端口?

以编程方式获取另一个进程的父 pid?

如何获取进程监听的端口?

如何获取 WCF 服务正在侦听的端口?

如何在同一台机器上以编程方式获取通过 AF_INET 套接字连接到我的代理的进程的 PID?

linux shell编程 根据端口获取进程pid 直接用命令netstat -anp grep 端口号 在shell中如何获取PID?