os/kernel/task/
process.rs

1//! 进程模块
2//!
3//! 已经采用多任务设计的内核,进程作为任务的一种特殊形式存在。
4//! 故此模块变得相对简单,主要负责适配传统的进程概念与内核任务之间的关系。
5
6use crate::{
7    kernel::{SharedTask, TASK_MANAGER, TaskManagerTrait, notify_parent},
8    uapi::signal::SignalFlags,
9};
10
11/// 进程退出处理
12/// 该函数负责清理进程资源并通知父进程,
13/// 如果该进程有子进程,处理孤儿进程
14/// 如果该进程有线程,处理线程退出
15/// # 参数:
16/// * `task` - 进程对应的任务
17/// * `code` - 退出码
18pub 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
49/// 向进程发送信号
50/// # 参数:
51/// * `task` - 目标进程对应的任务
52/// * `sig` - 要发送的信号编号
53pub 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}