Process.kill în Dart

kill trimite un semnal de oprire unui proces pornit cu Process.start; pid este numărul procesului dat de sistem.

Sintaxă
bool kill([ProcessSignal signal = ProcessSignal.sigterm])
int get pid

Ce face Process.kill

proces.kill() trimite semnalul SIGTERM, care cere programului să se oprească. Returnează true dacă semnalul a fost trimis. Pentru o oprire forțată, pe care programul nu o poate ignora, dai ProcessSignal.sigkill. Pe Windows orice semnal oprește procesul.

Pe macOS și Linux, un proces oprit de un semnal are exitCode negativ: -15 pentru SIGTERM, -9 pentru SIGKILL (minus numărul semnalului).

proces.pid este numărul unic pe care sistemul de operare l-a dat procesului; îl vezi și în ps sau în Task Manager. Numărul diferă la fiecare pornire. Procesul programului tău are și el un număr, în variabila globală pid din dart:io.

Parametri

Parametru Descriere
signal Opțional. Semnalul trimis; implicit ProcessSignal.sigterm.

Ce returnează

kill: true dacă semnalul a fost trimis. pid: numărul procesului.

Exemple

Exemplul 1: Oprirea unui proces care durează prea mult

import 'dart:io';

Future<void> main() async {
  final proces = await Process.start('sleep', ['30']);
  print('Proces pornit, pid pozitiv: ${proces.pid > 0}');
  print('Semnal trimis: ${proces.kill()}');
  print('Cod de ieșire: ${await proces.exitCode}');
}

Rezultat

Proces pornit, pid pozitiv: true
Semnal trimis: true
Cod de ieșire: -15

Exemplul 2: Limită de timp cu oprire forțată

Dacă procesul nu se termină în 300 ms, onTimeout îl oprește cu SIGKILL și așteaptă codul de ieșire.

import 'dart:async';
import 'dart:io';

Future<int> cuLimita(Process proces, Duration limita) {
  return proces.exitCode.timeout(limita, onTimeout: () {
    print('Timpul a expirat, opresc procesul.');
    proces.kill(ProcessSignal.sigkill);
    return proces.exitCode;
  });
}

Future<void> main() async {
  final rapid = await Process.start('sh', ['-c', 'exit 0']);
  print('Rapid: ${await cuLimita(rapid, const Duration(seconds: 5))}');
  final lent = await Process.start('sleep', ['30']);
  print('Lent: ${await cuLimita(lent, const Duration(milliseconds: 300))}');
}

Rezultat

Rapid: 0
Timpul a expirat, opresc procesul.
Lent: -9

Exemplul 3: Numerele proceselor

import 'dart:io';

Future<void> main() async {
  final copil = await Process.start('sleep', ['1']);
  print('Programul Dart: pid $pid');
  print('Procesul copil: pid ${copil.pid}');
  await copil.exitCode;
}

Rezultat posibil (diferă la fiecare rulare)

Programul Dart: pid 48213
Procesul copil: pid 48231

Greșeli frecvente

  • Apelezi kill și presupui că procesul s-a oprit deja: semnalul este doar trimis. Așteaptă await proces.exitCode.
  • Salvezi pid-ul ca să identifici procesul mai târziu: după ce procesul se termină, sistemul poate da același număr altui program.

Comenzi înrudite

  • Process.start: Pornește un program și returnează imediat un obiect Process, prin care îi trimiți date și îi citești ieșirea în timp ce rulează.
  • Process.run: Pornește alt program, așteaptă să se termine și returnează ce a scris (stdout, stderr) și codul de ieșire.
  • exit: Oprește imediat programul cu codul de ieșire dat: 0 pentru succes, altă valoare pentru eroare.