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

时间:2012-06-12 12:01:09

标签: 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

        }
}

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

2 个答案:

答案 0 :(得分:5)

netstat一样,您应该阅读/proc/net/tcp

解释:

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

    这使得找到这个过程非常烦人,但是可能 在/proc/net/tcp中查找正确的行并不困难,然后您可以获得inode编号 查找该过程需要您扫描所有进程,查找引用此inode编号的进程。我知道没有更好的方法。

答案 1 :(得分:3)

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

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

的形式搜索它

- &gt;插座:[]

希望有所帮助