进程退出了,但是进程所监听的端口还处在监听状态

qqwx_1986 2012-10-12 03:59:28
这个进程比较特殊,用system("start ")命令打开了其他的一些进程,然后该进程退出,用netstat发现该进程pid还在监听一个端口,但是任务管理器看不到这个进程pid了,然后把system打开的所有进程都关掉,我中间一个一个关发现直到最后一个进程关掉,这个端口才解除监听,有谁遇到这种情况,难道是system 问题?
...全文
3553 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmige 2013-09-19
  • 打赏
  • 举报
回复
好吧,是用start启动了其他进程之后,在其他进程还未退出时,windows的cmd进程和conhost进程都不会完全退出。此时如果启动start的父进程退出,也不会退出的很干净。端口就被留下来了。

解决办法:
只要用任务管理器杀死所有看到的cmd进程,里面必然有一个或几个是那个脏进程留下来的。杀掉后conhost也会退出。
然后就会发现端口什么的被释放掉。
xmige 2013-09-19
  • 打赏
  • 举报
回复
我也终于知道怎么回事了。哈哈哈
xmige 2013-09-19
  • 打赏
  • 举报
回复
引用
终于知道怎么回事了


求真相,知道了就怎么失踪了呢?
q96456 2013-09-13
  • 打赏
  • 举报
回复
求解决方法 除了重启电脑
Lazy8902 2013-01-25
  • 打赏
  • 举报
回复
大哥,我也遇到这个问题了,请问你是怎么解决的?先谢了
qqwx_1986 2012-10-26
  • 打赏
  • 举报
回复
终于知道怎么回事了
qqwx_1986 2012-10-19
  • 打赏
  • 举报
回复
晕,给错分了
赵4老师 2012-10-16
  • 打赏
  • 举报
回复
C:\>netstat /?

显示协议统计信息和当前 TCP/IP 网络连接。

NETSTAT [-a] [-b] [-e] [-n] [-o] [-p proto] [-r] [-s] [-t] [-v] [interval]

-a 显示所有连接和监听端口。
-b 显示包含于创建每个连接或监听端口的
可执行组件。在某些情况下已知可执行组件
拥有多个独立组件,并且在这些情况下
包含于创建连接或监听端口的组件序列
被显示。这种情况下,可执行组件名
在底部的 [] 中,顶部是其调用的组件,
等等,直到 TCP/IP 部分。注意此选项
可能需要很长时间,如果没有足够权限
可能失败。
-e 显示以太网统计信息。此选项可以与 -s
选项组合使用。
-n 以数字形式显示地址和端口号。
-o 显示与每个连接相关的所属进程 ID。
-p proto 显示 proto 指定的协议的连接;proto 可以是
下列协议之一: TCP、UDP、TCPv6 或 UDPv6。
如果与 -s 选项一起使用以显示按协议统计信息,proto 可以是下列协议之一:
IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
-r 显示路由表。
-s 显示按协议统计信息。默认地,显示 IP、
IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计信息;
-p 选项用于指定默认情况的子集。
-t 显示当前连接卸载状态。
-v 与 -b 选项一起使用时将显示包含于
为所有可执行组件创建连接或监听端口的
组件。
interval 重新显示选定统计信息,每次显示之间
暂停时间间隔(以秒计)。按 CTRL+C 停止重新
显示统计信息。如果省略,netstat 显示当前
配置信息(只显示一次)

C:\>
赵4老师 2012-10-16
  • 打赏
  • 举报
回复
C:\>tcpvcon /?

TCPView v2.52 - TCP/UDP endpoint viewer
Copyright (C) 1998-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

Usage: tcpvcon [-a] [-c] [-n] [process name or PID]
-a Show all endpoints (default is to show established TCP
connections).
-c Print output as CSV.
-n Don't resolve addressed.
process Only show endpoints owned by the process specified.


C:\>
赵4老师 2012-10-16
  • 打赏
  • 举报
回复
C:\>start /?
启动另一个窗口运行指定的程序或命令。

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
[parameters]

"title" 在窗口标题栏中显示的标题。
path 启动目录
B 不创建新窗口启动应用程序。除非启用
^C 处理,否则该应用程序会忽略 ^C
处理;^Break 是唯一可以中断该应用
程序的方式
I 新环境是传递给 cmd.exe 的原始环境,
而不是当前环境。
MIN 启动窗口最小化
MAX 启动窗口最大化
SEPARATE 在分离内存空间启动 16-位 Windows 程序
SHARED 在共享内存空间启动 16-位 Windows 程序
LOW 在 IDLE 优先级类中启动应用程序
NORMAL 在 NORMAL 优先级类中启动应用程序
HIGH 在 HIGH 优先级类中启动应用程序
REALTIME 在 REALTIME 优先级类中启动应用程序
ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序
BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序
AFFINITY 新应用程序将拥有指定处理器关系掩码,
以十六进制数表示。
WAIT 启动应用程序并等待它结束
command/program
如果是内部 cmd 命令或批文件,那么
该命令处理器是用 /K 命令行开关运行
cmd.exe 的。这表示该窗口在命令运行后
仍然存在。

如果不是内部 cmd 命令或批文件,则是
一个程序,并作为窗口应用程序或控制台
应用程序运行。

parameters 这些是传送到命令/程序的参数


如果命令扩展被启用,通过命令行或 START 命令的外部命令
调用会如下改变:

将文件名作为命令键入,非可执行文件可以通过文件关联调用。
(例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和
FTYPE 命令。

执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用
程序终止就返回命令提示符。如果在命令脚本内执行,该新行为
则不会发生。

如果执行的命令行的第一个符号是不带扩展名或路径修饰符的
字符串 "CMD","CMD" 会被 COMSPEC 变量的数值所替换。这
防止从当前目录提取 CMD.EXE。

如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用
PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展
名。PATHEXT 变量的默认值是:

.COM;.EXE;.BAT;.CMD

请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。

查找可执行文件时,如果没有相配的扩展名,看一看该名称是否
与目录名相配。如果确实如此,START 会在那个路径上调用
Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。

C:\>
qqwx_1986 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

你用start打开一系列进程,哪个进程监听端口了?
[/Quote]
都有网络连接,但是肯定和这个端口无关的
大熊猫侯佩 2012-10-16
  • 打赏
  • 举报
回复
你用start打开一系列进程,哪个进程监听端口了?
qqwx_1986 2012-10-16
  • 打赏
  • 举报
回复
移动到c版看看有人知道么
qqwx_1986 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

哪些start 的程序是第三方的还是你自己写的?
[/Quote]
都是自己很熟悉的服务器程序
大熊猫侯佩 2012-10-16
  • 打赏
  • 举报
回复
哪些start 的程序是第三方的还是你自己写的?
qqwx_1986 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

引用 20 楼 的回复:
用netstat查看这个端口就是前面已经退出的进程pid(而且这个pid在任务管理器看不到了,所以该进程已经over了),唉,现在就是这个闹不明白啊


内核可以让进程隐藏起来,对任务管理器不可见,我以前做过这个。 内核中的进程可能还在。即便是进程真的结束了,它在内核中的资源也未必就完全释放。
[/Quote]
你说的也有可能,问题是这个端口就是和system(start)打开的进程有关联,这些是怎么关联上去的
mujiok2003 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
用netstat查看这个端口就是前面已经退出的进程pid(而且这个pid在任务管理器看不到了,所以该进程已经over了),唉,现在就是这个闹不明白啊
[/Quote]

内核可以让进程隐藏起来,对任务管理器不可见,我以前做过这个。 内核中的进程可能还在。即便是进程真的结束了,它在内核中的资源也未必就完全释放。
大熊猫侯佩 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

我的理解:bind,listen等在内核中执行。用户进程退出后,内核可能依然在监听端口,所以可以建立连接,发送数据。端口复用一下就好了。
[/Quote]

我觉得有这种可能,但是正常使用这些程序的时候,不会发生这种情况,多半是使用的问题,比如

进程非正常退出。
qqwx_1986 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

引用 13 楼 的回复:
都有网络连接,但是肯定和这个端口无关的


不可能吧?那谁打开这个端口鸟?
[/Quote]
用netstat查看这个端口就是前面已经退出的进程pid(而且这个pid在任务管理器看不到了,所以该进程已经over了),唉,现在就是这个闹不明白啊
赵4老师 2012-10-16
  • 打赏
  • 举报
回复
《Windows编程启示录》
19.6 为什么有些进程在被终止之后还停留在任务管理器中
当某个进程结束时(可能是正常结束,也可能是因为调用了像TerminateProcess之类的函数),这个进程的用户态模块将被删除。但内核态模块只有在与线程相关的所有驱动程序执行完成之后才会被删除。
例如,如果某个线程正处于I/O操作中,那么将会给负责I/O的驱动程序发送一个内核信号来取消这个操作。
如果驱动程序的行为是良好的,那么它将清除与这个未完成I/O相关的一些信息并且释放线程。
如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。在这段时间里,驱动程序将不会释放这个线程(以及这个线程所在的进程)。实际的情况要更复杂一些,但这里的简单模型对于我们的讨论已经足够。
……
换句话说,如果你终止了某个进程后还能在任务管理器中看到这个进程,那么实际上这个进程已经停止运行了,只不过还有些残留的信息保留在系统中,只有当与这个进程相关的所有驱动程序都完成了清除操作并且指向这个进程的句柄都已经关闭,进程才会完全消失。
加载更多回复(12)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧