2012-06-12 67 views
2

我必須編寫一個SNMP模塊來監視我寫過的某個服務器應用程序。問題是我必須知道這個應用程序是否正在運行,並且我應該可以在任何時候殺死它。如何獲得在某個端口上以編程方式偵聽的進程的pid?

我知道應用程序正在偵聽的端口(讀取應用程序配置文件),我可以嘗試將此端口綁定到套接字以知道它是否被我的應用程序使用,或者另一個足夠我的模塊。下面是代碼:

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>,但我不知道如何以編程方式。有任何想法嗎??

+0

爲什麼不看'netstat'的代碼? –

+0

我做了一些__similar__。我已經使用了''strace'',並且我發現netstat打開了''/ proc/net/tcp'',但是我不知道如何從那裏獲得pid。 – chavaone

回答

4

netstat,你應該是/proc/net/tcp

其解釋:

  1. 第二字段,標題local_address,是IP和端口。 00000000:0050將是HTTP(端口號以十六進制表示)。
  2. 第四個字段標題爲st是州。 ATCP_LISTEN
  3. 第10個字段標題爲inode是inode號碼(這次是小數點)。
  4. 對於每個進程,/proc/pid/fd/包含每個打開文件描述符的條目。套接字描述符的ls -l表明它是鏈接到socket:[nnnnnn]。編號nnnnnn應該匹配/proc/net/tcp的inode編號。

這使得找到過程頗爲煩人,但可能。
找到/proc/net/tcp中的右邊線並不困難,然後就可以得到inode號了。
查找過程需要您掃描所有進程,查找引用此inode編號的進程。我知道沒有更好的辦法。

3

當然,你可以叉netstat的,不然做的netstat做什麼(我假設您正在使用的某種UNIX的):

在/ proc /網/ TCP「文件」顯示當前的TCP套接字。每行提供關於套接字的信息。 local_address字段以十六進制顯示IP:PORT格式的本地地址。從那裏你可以找到哪個套接字是對應於偵聽端口的套接字。然後你會得到相應的inode申請,你應該在

的形式,尋找它在所有的/ proc // FD鏈接 - >插座:[]

希望它可以幫助

相關問題