mod.rs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. use core::intrinsics::size_of;
  2. use alloc::{
  3. borrow::ToOwned,
  4. collections::BTreeMap,
  5. format,
  6. string::{String, ToString},
  7. sync::{Arc, Weak},
  8. vec::Vec,
  9. };
  10. use crate::{
  11. arch::asm::current::current_pcb,
  12. filesystem::vfs::{
  13. core::{generate_inode_id, ROOT_INODE},
  14. FileType,
  15. },
  16. include::bindings::bindings::{pid_t, process_find_pcb_by_pid},
  17. kerror,
  18. libs::spinlock::{SpinLock, SpinLockGuard},
  19. syscall::SystemError,
  20. time::TimeSpec,
  21. };
  22. use super::vfs::{
  23. file::{FileMode, FilePrivateData},
  24. FileSystem, FsInfo, IndexNode, InodeId, Metadata, PollStatus,
  25. };
  26. /// @brief 进程文件类型
  27. /// @usage 用于定义进程文件夹下的各类文件类型
  28. #[derive(Debug)]
  29. #[repr(u8)]
  30. pub enum ProcFileType {
  31. ///展示进程状态信息
  32. ProcStatus = 0,
  33. //todo: 其他文件类型
  34. ///默认文件类型
  35. Default,
  36. }
  37. impl From<u8> for ProcFileType {
  38. fn from(value: u8) -> Self {
  39. match value {
  40. 0 => ProcFileType::ProcStatus,
  41. _ => ProcFileType::Default,
  42. }
  43. }
  44. }
  45. /// @brief 节点私有信息结构体
  46. /// @usage 用于传入各类文件所需的信息
  47. #[derive(Debug)]
  48. pub struct InodeInfo {
  49. ///进程的pid
  50. pid: i64,
  51. ///文件类型
  52. ftype: ProcFileType,
  53. //其他需要传入的信息在此定义
  54. }
  55. /// @brief procfs的inode名称的最大长度
  56. const PROCFS_MAX_NAMELEN: usize = 64;
  57. /// @brief procfs文件系统的Inode结构体
  58. #[derive(Debug)]
  59. pub struct LockedProcFSInode(SpinLock<ProcFSInode>);
  60. /// @brief procfs文件系统结构体
  61. #[derive(Debug)]
  62. pub struct ProcFS {
  63. /// procfs的root inode
  64. root_inode: Arc<LockedProcFSInode>,
  65. }
  66. #[derive(Debug, Clone)]
  67. pub struct ProcfsFilePrivateData {
  68. data: Vec<u8>,
  69. }
  70. impl ProcfsFilePrivateData {
  71. pub fn new() -> Self {
  72. return ProcfsFilePrivateData { data: Vec::new() };
  73. }
  74. }
  75. /// @brief procfs文件系统的Inode结构体(不包含锁)
  76. #[derive(Debug)]
  77. pub struct ProcFSInode {
  78. /// 指向父Inode的弱引用
  79. parent: Weak<LockedProcFSInode>,
  80. /// 指向自身的弱引用
  81. self_ref: Weak<LockedProcFSInode>,
  82. /// 子Inode的B树
  83. children: BTreeMap<String, Arc<LockedProcFSInode>>,
  84. /// 当前inode的数据部分
  85. data: Vec<u8>,
  86. /// 当前inode的元数据
  87. metadata: Metadata,
  88. /// 指向inode所在的文件系统对象的指针
  89. fs: Weak<ProcFS>,
  90. /// 储存私有信息
  91. fdata: InodeInfo,
  92. }
  93. /// 对ProcFSInode实现获取各类文件信息的函数
  94. impl ProcFSInode {
  95. /// @brief 去除Vec中所有的\0,并在结尾添加\0
  96. #[inline]
  97. fn trim_string(&self, data: &mut Vec<u8>) {
  98. data.drain_filter(|x: &mut u8| *x == 0);
  99. data.push(0);
  100. }
  101. // todo:其他数据获取函数实现
  102. /// @brief 打开status文件
  103. ///
  104. fn open_status(&self, pdata: &mut ProcfsFilePrivateData) -> Result<i64, SystemError> {
  105. // 获取该pid对应的pcb结构体
  106. let pid: &i64 = &self.fdata.pid;
  107. let pcb = unsafe { process_find_pcb_by_pid(*pid).as_mut() };
  108. let pcb = if pcb.is_none() {
  109. kerror!(
  110. "ProcFS: Cannot find pcb for pid {} when opening its 'status' file.",
  111. pid
  112. );
  113. return Err(SystemError::ESRCH);
  114. } else {
  115. pcb.unwrap()
  116. };
  117. // 传入数据
  118. let pdata: &mut Vec<u8> = &mut pdata.data;
  119. // !!!!!由于目前有bug,不能获取到pcb的name,因此暂时用'Unknown'代替
  120. let tmp_name: Vec<u8> = "Unknown".as_bytes().to_vec();
  121. // kdebug!("pcb.name={:?}", pcb.name);
  122. // let mut tmp_name: Vec<u8> = Vec::with_capacity(pcb.name.len());
  123. // for val in pcb.name.iter() {
  124. // tmp_name.push(*val as u8);
  125. // }
  126. pdata.append(
  127. &mut format!(
  128. "Name:\t{}",
  129. String::from_utf8(tmp_name).unwrap_or("NULL".to_string())
  130. )
  131. .as_bytes()
  132. .to_owned(),
  133. );
  134. pdata.append(&mut format!("\nstate:\t{}", pcb.state).as_bytes().to_owned());
  135. pdata.append(&mut format!("\npid:\t{}", pcb.pid).as_bytes().to_owned());
  136. pdata.append(
  137. &mut format!("\nPpid:\t{}", unsafe { *pcb.parent_pcb }.pid)
  138. .as_bytes()
  139. .to_owned(),
  140. );
  141. pdata.append(&mut format!("\ncpu_id:\t{}", pcb.cpu_id).as_bytes().to_owned());
  142. pdata.append(
  143. &mut format!("\npriority:\t{}", pcb.priority)
  144. .as_bytes()
  145. .to_owned(),
  146. );
  147. pdata.append(
  148. &mut format!("\npreempt:\t{}", pcb.preempt_count)
  149. .as_bytes()
  150. .to_owned(),
  151. );
  152. pdata.append(
  153. &mut format!("\nvrtime:\t{}", pcb.virtual_runtime)
  154. .as_bytes()
  155. .to_owned(),
  156. );
  157. let binding = current_pcb().address_space().unwrap();
  158. let address_space_guard = binding.read();
  159. // todo: 当前进程运行过程中占用内存的峰值
  160. let hiwater_vm: u64 = 0;
  161. // 进程代码段的大小
  162. let text = (address_space_guard.end_code - address_space_guard.start_code) / 1024;
  163. // 进程数据段的大小
  164. let data = (address_space_guard.end_data - address_space_guard.start_data) / 1024;
  165. drop(address_space_guard);
  166. pdata.append(
  167. &mut format!("\nVmPeak:\t{} kB", hiwater_vm)
  168. .as_bytes()
  169. .to_owned(),
  170. );
  171. pdata.append(&mut format!("\nVmData:\t{} kB", data).as_bytes().to_owned());
  172. pdata.append(&mut format!("\nVmExe:\t{} kB\n", text).as_bytes().to_owned());
  173. // 去除多余的\0
  174. self.trim_string(pdata);
  175. return Ok((pdata.len() * size_of::<u8>()) as i64);
  176. }
  177. /// status文件读取函数
  178. fn read_status(
  179. &self,
  180. offset: usize,
  181. len: usize,
  182. buf: &mut [u8],
  183. _pdata: &mut ProcfsFilePrivateData,
  184. ) -> Result<usize, SystemError> {
  185. let start = _pdata.data.len().min(offset);
  186. let end = _pdata.data.len().min(offset + len);
  187. // buffer空间不足
  188. if buf.len() < (end - start) {
  189. return Err(SystemError::ENOBUFS);
  190. }
  191. // 拷贝数据
  192. let src = &_pdata.data[start..end];
  193. buf[0..src.len()].copy_from_slice(src);
  194. return Ok(src.len());
  195. }
  196. }
  197. impl FileSystem for ProcFS {
  198. fn root_inode(&self) -> Arc<dyn super::vfs::IndexNode> {
  199. return self.root_inode.clone();
  200. }
  201. fn info(&self) -> FsInfo {
  202. return FsInfo {
  203. blk_dev_id: 0,
  204. max_name_len: PROCFS_MAX_NAMELEN,
  205. };
  206. }
  207. fn as_any_ref(&self) -> &dyn core::any::Any {
  208. self
  209. }
  210. }
  211. impl ProcFS {
  212. pub fn new() -> Arc<Self> {
  213. // 初始化root inode
  214. let root: Arc<LockedProcFSInode> =
  215. Arc::new(LockedProcFSInode(SpinLock::new(ProcFSInode {
  216. parent: Weak::default(),
  217. self_ref: Weak::default(),
  218. children: BTreeMap::new(),
  219. data: Vec::new(),
  220. metadata: Metadata {
  221. dev_id: 0,
  222. inode_id: generate_inode_id(),
  223. size: 0,
  224. blk_size: 0,
  225. blocks: 0,
  226. atime: TimeSpec::default(),
  227. mtime: TimeSpec::default(),
  228. ctime: TimeSpec::default(),
  229. file_type: FileType::Dir,
  230. mode: 0o777,
  231. nlinks: 1,
  232. uid: 0,
  233. gid: 0,
  234. raw_dev: 0,
  235. },
  236. fs: Weak::default(),
  237. fdata: InodeInfo {
  238. pid: 0,
  239. ftype: ProcFileType::Default,
  240. },
  241. })));
  242. let result: Arc<ProcFS> = Arc::new(ProcFS { root_inode: root });
  243. // 对root inode加锁,并继续完成初始化工作
  244. let mut root_guard: SpinLockGuard<ProcFSInode> = result.root_inode.0.lock();
  245. root_guard.parent = Arc::downgrade(&result.root_inode);
  246. root_guard.self_ref = Arc::downgrade(&result.root_inode);
  247. root_guard.fs = Arc::downgrade(&result);
  248. // 释放锁
  249. drop(root_guard);
  250. return result;
  251. }
  252. /// @brief 进程注册函数
  253. /// @usage 在进程中调用并创建进程对应文件
  254. pub fn register_pid(&self, pid: i64) -> Result<(), SystemError> {
  255. // 获取当前inode
  256. let proc: Arc<dyn IndexNode> = self.root_inode();
  257. // 创建对应进程文件夹
  258. let _pf: Arc<dyn IndexNode> = proc.create(&pid.to_string(), FileType::Dir, 0o777)?;
  259. // 创建相关文件
  260. // status文件
  261. let binding: Arc<dyn IndexNode> = _pf.create("status", FileType::File, 0o777)?;
  262. let _sf: &LockedProcFSInode = binding
  263. .as_any_ref()
  264. .downcast_ref::<LockedProcFSInode>()
  265. .unwrap();
  266. _sf.0.lock().fdata.pid = pid;
  267. _sf.0.lock().fdata.ftype = ProcFileType::ProcStatus;
  268. //todo: 创建其他文件
  269. return Ok(());
  270. }
  271. /// @brief 解除进程注册
  272. ///
  273. pub fn unregister_pid(&self, pid: i64) -> Result<(), SystemError> {
  274. // 获取当前inode
  275. let proc: Arc<dyn IndexNode> = self.root_inode();
  276. // 获取进程文件夹
  277. let pid_dir: Arc<dyn IndexNode> = proc.find(&format!("{}", pid))?;
  278. // 删除进程文件夹下文件
  279. pid_dir.unlink("status")?;
  280. // 查看进程文件是否还存在
  281. // let pf= pid_dir.find("status").expect("Cannot find status");
  282. // 删除进程文件夹
  283. proc.unlink(&format!("{}", pid))?;
  284. return Ok(());
  285. }
  286. }
  287. impl IndexNode for LockedProcFSInode {
  288. fn open(&self, data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), SystemError> {
  289. // 加锁
  290. let mut inode: SpinLockGuard<ProcFSInode> = self.0.lock();
  291. // 如果inode类型为文件夹,则直接返回成功
  292. if let FileType::Dir = inode.metadata.file_type {
  293. return Ok(());
  294. }
  295. let mut private_data = ProcfsFilePrivateData::new();
  296. // 根据文件类型获取相应数据
  297. let file_size = match inode.fdata.ftype {
  298. ProcFileType::ProcStatus => inode.open_status(&mut private_data)?,
  299. _ => {
  300. todo!()
  301. }
  302. };
  303. *data = FilePrivateData::Procfs(private_data);
  304. // 更新metadata里面的文件大小数值
  305. inode.metadata.size = file_size;
  306. return Ok(());
  307. }
  308. fn close(&self, data: &mut FilePrivateData) -> Result<(), SystemError> {
  309. let guard: SpinLockGuard<ProcFSInode> = self.0.lock();
  310. // 如果inode类型为文件夹,则直接返回成功
  311. if let FileType::Dir = guard.metadata.file_type {
  312. return Ok(());
  313. }
  314. // 获取数据信息
  315. let private_data = match data {
  316. FilePrivateData::Procfs(p) => p,
  317. _ => {
  318. panic!("ProcFS: FilePrivateData mismatch!");
  319. }
  320. };
  321. // 释放资源
  322. drop(private_data);
  323. return Ok(());
  324. }
  325. fn read_at(
  326. &self,
  327. offset: usize,
  328. len: usize,
  329. buf: &mut [u8],
  330. data: &mut FilePrivateData,
  331. ) -> Result<usize, SystemError> {
  332. if buf.len() < len {
  333. return Err(SystemError::EINVAL);
  334. }
  335. // 加锁
  336. let inode: SpinLockGuard<ProcFSInode> = self.0.lock();
  337. // 检查当前inode是否为一个文件夹,如果是的话,就返回错误
  338. if inode.metadata.file_type == FileType::Dir {
  339. return Err(SystemError::EISDIR);
  340. }
  341. // 获取数据信息
  342. let private_data = match data {
  343. FilePrivateData::Procfs(p) => p,
  344. _ => {
  345. panic!("ProcFS: FilePrivateData mismatch!");
  346. }
  347. };
  348. // 根据文件类型读取相应数据
  349. match inode.fdata.ftype {
  350. ProcFileType::ProcStatus => return inode.read_status(offset, len, buf, private_data),
  351. ProcFileType::Default => (),
  352. };
  353. // 默认读取
  354. let start = inode.data.len().min(offset);
  355. let end = inode.data.len().min(offset + len);
  356. // buffer空间不足
  357. if buf.len() < (end - start) {
  358. return Err(SystemError::ENOBUFS);
  359. }
  360. // 拷贝数据
  361. let src = &inode.data[start..end];
  362. buf[0..src.len()].copy_from_slice(src);
  363. return Ok(src.len());
  364. }
  365. fn write_at(
  366. &self,
  367. _offset: usize,
  368. _len: usize,
  369. _buf: &[u8],
  370. _data: &mut FilePrivateData,
  371. ) -> Result<usize, SystemError> {
  372. return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
  373. }
  374. fn poll(&self) -> Result<PollStatus, SystemError> {
  375. // 加锁
  376. let inode: SpinLockGuard<ProcFSInode> = self.0.lock();
  377. // 检查当前inode是否为一个文件夹,如果是的话,就返回错误
  378. if inode.metadata.file_type == FileType::Dir {
  379. return Err(SystemError::EISDIR);
  380. }
  381. return Ok(PollStatus::READ);
  382. }
  383. fn fs(&self) -> Arc<dyn FileSystem> {
  384. return self.0.lock().fs.upgrade().unwrap();
  385. }
  386. fn as_any_ref(&self) -> &dyn core::any::Any {
  387. self
  388. }
  389. fn metadata(&self) -> Result<Metadata, SystemError> {
  390. let inode = self.0.lock();
  391. let metadata = inode.metadata.clone();
  392. return Ok(metadata);
  393. }
  394. fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> {
  395. let mut inode = self.0.lock();
  396. inode.metadata.atime = metadata.atime;
  397. inode.metadata.mtime = metadata.mtime;
  398. inode.metadata.ctime = metadata.ctime;
  399. inode.metadata.mode = metadata.mode;
  400. inode.metadata.uid = metadata.uid;
  401. inode.metadata.gid = metadata.gid;
  402. return Ok(());
  403. }
  404. fn resize(&self, len: usize) -> Result<(), SystemError> {
  405. let mut inode = self.0.lock();
  406. if inode.metadata.file_type == FileType::File {
  407. inode.data.resize(len, 0);
  408. return Ok(());
  409. } else {
  410. return Err(SystemError::EINVAL);
  411. }
  412. }
  413. fn create_with_data(
  414. &self,
  415. name: &str,
  416. file_type: FileType,
  417. mode: u32,
  418. data: usize,
  419. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  420. // 获取当前inode
  421. let mut inode = self.0.lock();
  422. // 如果当前inode不是文件夹,则返回
  423. if inode.metadata.file_type != FileType::Dir {
  424. return Err(SystemError::ENOTDIR);
  425. }
  426. // 如果有重名的,则返回
  427. if inode.children.contains_key(name) {
  428. return Err(SystemError::EEXIST);
  429. }
  430. // 创建inode
  431. let result: Arc<LockedProcFSInode> =
  432. Arc::new(LockedProcFSInode(SpinLock::new(ProcFSInode {
  433. parent: inode.self_ref.clone(),
  434. self_ref: Weak::default(),
  435. children: BTreeMap::new(),
  436. data: Vec::new(),
  437. metadata: Metadata {
  438. dev_id: 0,
  439. inode_id: generate_inode_id(),
  440. size: 0,
  441. blk_size: 0,
  442. blocks: 0,
  443. atime: TimeSpec::default(),
  444. mtime: TimeSpec::default(),
  445. ctime: TimeSpec::default(),
  446. file_type: file_type,
  447. mode: mode,
  448. nlinks: 1,
  449. uid: 0,
  450. gid: 0,
  451. raw_dev: data,
  452. },
  453. fs: inode.fs.clone(),
  454. fdata: InodeInfo {
  455. pid: 0,
  456. ftype: ProcFileType::Default,
  457. },
  458. })));
  459. // 初始化inode的自引用的weak指针
  460. result.0.lock().self_ref = Arc::downgrade(&result);
  461. // 将子inode插入父inode的B树中
  462. inode.children.insert(String::from(name), result.clone());
  463. return Ok(result);
  464. }
  465. fn link(&self, name: &str, other: &Arc<dyn IndexNode>) -> Result<(), SystemError> {
  466. let other: &LockedProcFSInode = other
  467. .downcast_ref::<LockedProcFSInode>()
  468. .ok_or(SystemError::EPERM)?;
  469. let mut inode: SpinLockGuard<ProcFSInode> = self.0.lock();
  470. let mut other_locked: SpinLockGuard<ProcFSInode> = other.0.lock();
  471. // 如果当前inode不是文件夹,那么报错
  472. if inode.metadata.file_type != FileType::Dir {
  473. return Err(SystemError::ENOTDIR);
  474. }
  475. // 如果另一个inode是文件夹,那么也报错
  476. if other_locked.metadata.file_type == FileType::Dir {
  477. return Err(SystemError::EISDIR);
  478. }
  479. // 如果当前文件夹下已经有同名文件,也报错。
  480. if inode.children.contains_key(name) {
  481. return Err(SystemError::EEXIST);
  482. }
  483. inode
  484. .children
  485. .insert(String::from(name), other_locked.self_ref.upgrade().unwrap());
  486. // 增加硬链接计数
  487. other_locked.metadata.nlinks += 1;
  488. return Ok(());
  489. }
  490. fn unlink(&self, name: &str) -> Result<(), SystemError> {
  491. let mut inode: SpinLockGuard<ProcFSInode> = self.0.lock();
  492. // 如果当前inode不是目录,那么也没有子目录/文件的概念了,因此要求当前inode的类型是目录
  493. if inode.metadata.file_type != FileType::Dir {
  494. return Err(SystemError::ENOTDIR);
  495. }
  496. // 不允许删除当前文件夹,也不允许删除上一个目录
  497. if name == "." || name == ".." {
  498. return Err(SystemError::ENOTEMPTY);
  499. }
  500. // 获得要删除的文件的inode
  501. let to_delete = inode.children.get(name).ok_or(SystemError::ENOENT)?;
  502. // 减少硬链接计数
  503. to_delete.0.lock().metadata.nlinks -= 1;
  504. // 在当前目录中删除这个子目录项
  505. inode.children.remove(name);
  506. return Ok(());
  507. }
  508. fn move_(
  509. &self,
  510. _old_name: &str,
  511. _target: &Arc<dyn IndexNode>,
  512. _new_name: &str,
  513. ) -> Result<(), SystemError> {
  514. return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
  515. }
  516. fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> {
  517. let inode = self.0.lock();
  518. if inode.metadata.file_type != FileType::Dir {
  519. return Err(SystemError::ENOTDIR);
  520. }
  521. match name {
  522. "" | "." => {
  523. return Ok(inode.self_ref.upgrade().ok_or(SystemError::ENOENT)?);
  524. }
  525. ".." => {
  526. return Ok(inode.parent.upgrade().ok_or(SystemError::ENOENT)?);
  527. }
  528. name => {
  529. // 在子目录项中查找
  530. return Ok(inode.children.get(name).ok_or(SystemError::ENOENT)?.clone());
  531. }
  532. }
  533. }
  534. fn get_entry_name(&self, ino: InodeId) -> Result<String, SystemError> {
  535. let inode: SpinLockGuard<ProcFSInode> = self.0.lock();
  536. if inode.metadata.file_type != FileType::Dir {
  537. return Err(SystemError::ENOTDIR);
  538. }
  539. match ino {
  540. 0 => {
  541. return Ok(String::from("."));
  542. }
  543. 1 => {
  544. return Ok(String::from(".."));
  545. }
  546. ino => {
  547. // 暴力遍历所有的children,判断inode id是否相同
  548. // TODO: 优化这里,这个地方性能很差!
  549. let mut key: Vec<String> = inode
  550. .children
  551. .keys()
  552. .filter(|k| inode.children.get(*k).unwrap().0.lock().metadata.inode_id == ino)
  553. .cloned()
  554. .collect();
  555. match key.len() {
  556. 0=>{return Err(SystemError::ENOENT);}
  557. 1=>{return Ok(key.remove(0));}
  558. _ => panic!("Procfs get_entry_name: key.len()={key_len}>1, current inode_id={inode_id}, to find={to_find}", key_len=key.len(), inode_id = inode.metadata.inode_id, to_find=ino)
  559. }
  560. }
  561. }
  562. }
  563. fn list(&self) -> Result<Vec<String>, SystemError> {
  564. let info = self.metadata()?;
  565. if info.file_type != FileType::Dir {
  566. return Err(SystemError::ENOTDIR);
  567. }
  568. let mut keys: Vec<String> = Vec::new();
  569. keys.push(String::from("."));
  570. keys.push(String::from(".."));
  571. keys.append(&mut self.0.lock().children.keys().cloned().collect());
  572. return Ok(keys);
  573. }
  574. }
  575. #[no_mangle]
  576. pub extern "C" fn rs_procfs_register_pid(pid: pid_t) -> u64 {
  577. let r = procfs_register_pid(pid);
  578. if r.is_ok() {
  579. return 0;
  580. } else {
  581. return r.unwrap_err() as u64;
  582. }
  583. }
  584. /// @brief 向procfs注册进程
  585. pub fn procfs_register_pid(pid: pid_t) -> Result<(), SystemError> {
  586. let procfs_inode = ROOT_INODE().find("proc")?;
  587. let procfs_inode = procfs_inode
  588. .downcast_ref::<LockedProcFSInode>()
  589. .expect("Failed to find procfs' root inode");
  590. let fs = procfs_inode.fs();
  591. let procfs: &ProcFS = fs.as_any_ref().downcast_ref::<ProcFS>().unwrap();
  592. // 调用注册函数
  593. procfs.register_pid(pid)?;
  594. return Ok(());
  595. }
  596. #[no_mangle]
  597. pub extern "C" fn rs_procfs_unregister_pid(pid: pid_t) -> u64 {
  598. let r = procfs_unregister_pid(pid);
  599. if r.is_ok() {
  600. return 0;
  601. } else {
  602. return r.unwrap_err() as u64;
  603. }
  604. }
  605. /// @brief 在ProcFS中,解除进程的注册
  606. pub fn procfs_unregister_pid(pid: pid_t) -> Result<(), SystemError> {
  607. // 获取procfs实例
  608. let procfs_inode: Arc<dyn IndexNode> = ROOT_INODE().find("proc")?;
  609. let procfs_inode: &LockedProcFSInode = procfs_inode
  610. .downcast_ref::<LockedProcFSInode>()
  611. .expect("Failed to find procfs' root inode");
  612. let fs: Arc<dyn FileSystem> = procfs_inode.fs();
  613. let procfs: &ProcFS = fs.as_any_ref().downcast_ref::<ProcFS>().unwrap();
  614. // 调用解除注册函数
  615. return procfs.unregister_pid(pid);
  616. }