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.