# kill_port : 跨平台高效终止端口进程工具

跨平台端口进程终止工具。定位并清除绑定指定端口的进程，保障开发与自动化工作流顺畅。提供零堆分配的进程去重设计。

## 使用演示

完整演示代码请参考 `tests/`。

```rust
use kill_port::kill;

fn main() -> std::io::Result<()> {
  // 终止占用 8080 端口的进程
  kill(8080)?;
  Ok(())
}
```

## 特性介绍

- **零堆内存分配**：采用栈上固定大小数组进行 PID 去重，消除高频重试下的内存抖动与堆分配开销。
- **渐进式信号升级**：Unix 系统下优先发送 `SIGTERM`（优雅退出），重试 10 次无效后升级为 `SIGKILL`（强制杀死）。Windows 系统下直接执行进程树清除。
- **自我保护机制**：自动识别并排除当前调用进程 PID，防止进程自杀。

## 设计思路

1. **发现**: 通过 `listeners` 库获取目标端口的监听器。
2. **过滤**: 利用栈上 `[u32; 16]` 数组去重并过滤掉调用进程的 PID。
3. **清除**: 视操作系统执行信号发送（Unix）或进程树杀死（Windows）。
4. **重试**: 若仍有残留进程，则休眠并重新获取状态，直至端口完全释放。

```mermaid
graph TD
  A[调用 kill] --> B[获取端口监听者]
  B --> C{是否发现进程?}
  C -->|否| D[执行成功]
  C -->|是| E[过滤自身并去重]
  E --> F{仍有目标?}
  F -->|否| D
  F -->|是| G[终止进程]
  G --> H{重试次数 > 10?}
  H -->|否| I[SIGTERM / Windows 进程树清除]
  H -->|是| J[SIGKILL / Windows 进程树清除]
  I --> K[休眠并重试]
  J --> K
  K --> B
```

## 技术栈

- **Rust**: 开发语言 (Edition 2024)。
- **listeners**: 跨平台监听端口探测。
- **nix**: Unix 信号管理。
- **kill_tree**: Windows 进程树强制退出。
- **log**: 日志输出。

## 目录结构

```text
kill_port/
├── src/
│   ├── lib.rs       # 核心导出
│   └── os/          # 平台相关底层实现
├── tests/
│   └── main.rs      # 集成测试
└── Cargo.toml       # 项目清单
```

## API 说明

### `kill_port::kill`

```rust
pub fn kill(port: u16) -> std::io::Result<()>
```

定位并终止监听指定端口的进程。

- **参数**: `port` (u16) - 网络端口号。
- **返回值**: `std::io::Result<()>` - 执行结果。

## 历史小故事

“Kill”（杀死）一词最初源自 Multics 操作系统与早期的 Unix。虽然名字听起来充斥着毁灭感，但 `kill` 命令的设计初衷实则是传递“信号（Signal）”。`SIGKILL` (Signal 9) 作为系统内核的终极指令，无法被进程捕获、阻塞或忽略，因此能做到立竿见影的彻底查杀；而 `SIGTERM` (Signal 15) 则是请求进程自我清理后退出。

在当今开发环境中，由于热重载服务泛滥，僵尸开发进程强占端口（`EADDRINUSE`）屡见不鲜。以往手动使用 `lsof` 和 `kill -9` 的繁琐仪式，如今已由 `kill_port` 这种工具自动化接管，将底层的信号量控制逻辑妥善隐藏于精简的 API 之下。
