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

cha*_*one 3 c port pid

我必须编写一个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

        }
}
Run Code Online (Sandbox Code Playgroud)

问题出现在我需要杀死应用程序时,我既不知道它PID也不知道如何获取它.我可以使用netstat -tln <port>但我不知道如何以编程方式进行.有任何想法吗??

ugo*_*ren 5

就像netstat,你应该阅读/proc/net/tcp.

解释它:

  1. 标题为第二个字段local_address是IP和端口.00000000:0050将是HTTP(端口号是十六进制).
  2. 标题为第4个字段st是州.ATCP_LISTEN.
  3. 第10个字段,标题inode为inode编号(此时为小数).
  4. 对于每个进程,/proc/pid/fd/包含每个打开文件描述符的条目.ls -l对于套接字描述符显示它是一个链接socket:[nnnnnn].该数字nnnnnn应与来自的inode编号匹配/proc/net/tcp.

这使得找到这个过程非常烦人,但可能.
找到合适的线/proc/net/tcp并不难,然后你就可以得到inode数.
查找该过程需要您扫描所有进程,查找引用此inode编号的进程.我知道没有更好的方法.