我必须编写一个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>
,但我不知道如何以编程方式进行。任何想法??
答案 0 :(得分:5)
与netstat
一样,您应该阅读/proc/net/tcp
。
解释:
local_address
的第二个字段是IP和端口。 00000000:0050
将是HTTP(端口号为十六进制)。st
的第4个字段是州。 A
是TCP_LISTEN
。inode
的第10个字段是inode编号(此时为小数)。/proc/pid/fd/
包含每个打开文件描述符的条目。套接字描述符的ls -l
表明它是socket:[nnnnnn]
的链接。数字nnnnnn
应与/proc/net/tcp
。这使得找到这个过程非常烦人,但是可能
在/proc/net/tcp
中查找正确的行并不困难,然后您可以获得inode编号
查找该过程需要您扫描所有进程,查找引用此inode编号的进程。我知道没有更好的方法。
答案 1 :(得分:3)
当然你可以fork netstat,或者做netstat做的事情(我假设你正在使用某种unix):
/ proc / net / tcp'file'显示当前的tcp套接字。每行提供有关套接字的信息。 local_address字段以IP:PORT格式显示本地地址,以十六进制表示。从那里你可以找到哪个套接字是与监听端口对应的套接字。然后你得到相应的inode字段,你应该在所有/ proc // fd链接中以
的形式搜索它- &gt;插座:[]
希望有所帮助