os/fs/proc/generators/process/
status.rs

1use alloc::{format, sync::Weak, vec::Vec};
2
3use crate::{
4    fs::proc::ContentGenerator,
5    kernel::{TaskState, TaskStruct},
6    sync::SpinLock,
7    vfs::FsError,
8};
9
10/// 为指定任务生成 /proc/\[pid\]/status 内容的生成器
11pub struct StatusGenerator {
12    task: Weak<SpinLock<TaskStruct>>,
13}
14
15impl StatusGenerator {
16    pub fn new(task: Weak<SpinLock<TaskStruct>>) -> Self {
17        Self { task }
18    }
19}
20
21impl ContentGenerator for StatusGenerator {
22    fn generate(&self) -> Result<Vec<u8>, FsError> {
23        let task_arc = self.task.upgrade().ok_or(FsError::NotFound)?;
24        let task = task_arc.lock();
25
26        // 状态字符串映射
27        let state_char = match task.state {
28            TaskState::Running => 'R',
29            TaskState::Interruptible => 'S',
30            TaskState::Uninterruptible => 'D',
31            TaskState::Stopped => 'T',
32            TaskState::Zombie => 'Z',
33        };
34
35        // 获取进程名称(简化实现,暂时使用 "task_<tid>")
36        let name = format!("task_{}", task.tid);
37
38        // 构建 status 内容(遵循 Linux ABI 格式)
39        let content = format!(
40            "Name:\t{}\n\
41             State:\t{} ({})\n\
42             Tgid:\t{}\n\
43             Pid:\t{}\n\
44             PPid:\t{}\n\
45             TracerPid:\t0\n\
46             Uid:\t0\t0\t0\t0\n\
47             Gid:\t0\t0\t0\t0\n",
48            name,
49            state_char,
50            state_name(state_char),
51            task.pid,
52            task.tid,
53            task.ppid,
54        );
55
56        Ok(content.into_bytes())
57    }
58}
59
60fn state_name(state: char) -> &'static str {
61    match state {
62        'R' => "running",
63        'S' => "sleeping",
64        'D' => "disk sleep",
65        'T' => "stopped",
66        'Z' => "zombie",
67        _ => "unknown",
68    }
69}