程序中解决Windows服务器下进程不存在但端口被占用问题

程序中解决Windows服务器下进程不存在但端口被占用问题问题现象:1、使用命令netstat -ano | findstr 端口查看端口占用进程,会得到端口占用进程的PID号,但通过PID号在任务管理器中查不到该进程,且使用命令taskkill /f /pid PID号时报错没有找到进程;2、使用Process Explorer工具搜索PID号会发现进程中存在一cmd.exe子进程;3、...
摘要由CSDN通过智能技术生成

程序中解决Windows服务器下进程不存在但端口被占用问题

问题现象:

1、使用命令netstat -ano | findstr 端口查看端口占用进程,会得到端口占用进程的PID号,但通过PID号在任务管理器中查不到该进程,且使用命令taskkill /f /pid PID号时报错没有找到进程;
2、使用Process Explorer工具搜索PID号会发现进程中存在一cmd.exe子进程;
3、若此时在任务管理器中或cmd命令中杀死该cmd.exe进程,会发现原占用端口被释放。

问题原因:

程序停止时调用了system()函数,而此函数会启动cmd.exe程序执行系统命令,在某些异常情况(也可能系统本身问题)下,会出现原程序已被停止释放,但cmd子进程迟迟未被回收,导致原程序占用端口未被释放。

程序修改方法:

可以通过父子进程的关系进行优化解决,虽然系统其它进程也会调用cmd.exe进程,但正常情况下它们父子关系是存在的。在如上问题中,cmd.exe进程的父进程已不存在,故可以将其看做是异常泄漏进程。那么,我们在启动程序服务前只需让程序遍历目前服务器中所有的进程,找到不存在父子关系的cmd.exe进程,将其先行杀死,这样既可避免因异常cmd进程占用程序端口导致程序无法启动的问题。

#include <Tlhelp32.h>
int ProcessStatus(UINT uPid)
{
   
	HANDLE hProcessSnap;
	HANDLE hProcess;
	PROCESSENTRY32 pe32;

	// Take a snapshot of all processes in the system.
	hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
	if( hProcessSnap == INVALID_HANDLE_VALUE ) 
	{
   
		return -1;
	
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值