5

我必须编写一个 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>,但我不知道如何以编程方式进行。有任何想法吗??

4

2 回答 2

6

喜欢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 编号的进程。我不知道更好的办法。

于 2012-06-12T13:59:08.377 回答
3

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

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

-> 套接字:[]

希望能帮助到你

于 2012-06-12T13:46:48.757 回答