os/kernel/task/
process.rs1use crate::{
7 kernel::{SharedTask, TASK_MANAGER, TaskManagerTrait, notify_parent},
8 uapi::signal::SignalFlags,
9};
10
11pub fn exit_process(task: SharedTask, code: i32) {
19 if !task.lock().is_process() {
20 panic!("exit_process called on a non-process task");
21 }
22 let (children, threads, init_task) = {
23 let mut t = TASK_MANAGER.lock();
24 t.exit_task(task.clone(), code);
25 (
26 t.get_process_children(task.clone()),
27 t.get_process_threads(task.clone()),
28 t.get_task(1).expect("init process not found"),
29 )
30 };
31 {
32 let init = init_task.lock();
33 let mut pchild = init.children.lock();
34 for child in children {
35 let mut c = child.lock();
36 pchild.push(child.clone());
37 c.ppid = init.pid;
38 }
39 }
40 {
41 let mut t = TASK_MANAGER.lock();
42 for thread in threads {
43 t.exit_task(thread, 0x114514);
44 }
45 }
46 notify_parent(task);
47}
48
49pub fn send_signal_process(task: &SharedTask, sig: usize) {
54 task.lock()
55 .shared_pending
56 .lock()
57 .signals
58 .insert(SignalFlags::from_signal_num(sig).unwrap());
59}