---
name: process_kill
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: impure
signature: "func ProcessKill(handle *ProcessHandle, graceSec int) error"
description: "Termina un subproceso enviando SIGTERM al process group. Espera hasta graceSec segundos a que el proceso muera voluntariamente. Si sigue vivo, envia SIGKILL. Retorna error solo si la senal no pudo entregarse."
tags: [process, subprocess, kill, signal, sigterm, sigkill, infra]
uses_functions: []
uses_types: [process_handle_go_infra]
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [fmt, syscall, time]
params:
  - name: handle
    desc: "handle del proceso lanzado por ProcessSpawn"
  - name: graceSec
    desc: "segundos de gracia entre SIGTERM y SIGKILL; 0 envia SIGKILL inmediatamente"
output: "nil si el proceso fue terminado correctamente; error si la senal no pudo entregarse"
tested: true
tests:
  - "kill process"
test_file_path: "functions/infra/process_spawn_test.go"
file_path: "functions/infra/process_kill.go"
---

## Ejemplo

```go
h, err := ProcessSpawn("sleep 300", "", nil, "")
if err != nil {
    log.Fatal(err)
}
// Dar 3 segundos de gracia antes de SIGKILL
if err := ProcessKill(h, 3); err != nil {
    log.Printf("kill failed: %v", err)
}
```

## Notas

Funcion impura: envia senales al sistema operativo. Usa -handle.Pid (negativo) para direccionar el process group completo, matando tanto al proceso principal como a sus hijos. ESRCH se ignora porque significa que el proceso ya murio, lo cual es el objetivo deseado. Comprueba si el proceso sigue vivo con signal 0 (kill -0) cada 100ms durante el grace period.
