sys_pidfd_sendsignal.rs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. use crate::arch::ipc::signal::Signal;
  2. use crate::ipc::signal_types::SigCode;
  3. use crate::ipc::signal_types::{SigInfo, SigType};
  4. use alloc::string::ToString;
  5. use alloc::vec::Vec;
  6. use core::ffi::c_int;
  7. use crate::arch::interrupt::TrapFrame;
  8. use crate::process::RawPid;
  9. use crate::syscall::table::FormattedSyscallParam;
  10. use crate::syscall::table::Syscall;
  11. use crate::{arch::syscall::nr::SYS_PIDFD_SEND_SIGNAL, process::ProcessManager};
  12. use system_error::SystemError;
  13. pub struct SysPidfdSendSignalHandle;
  14. impl SysPidfdSendSignalHandle {
  15. #[inline(always)]
  16. fn pidfd(args: &[usize]) -> i32 {
  17. args[0] as i32
  18. }
  19. #[inline(always)]
  20. fn sig(args: &[usize]) -> c_int {
  21. args[1] as c_int
  22. }
  23. #[inline(always)]
  24. fn siginfo(args: &[usize]) -> *mut i32 {
  25. args[2] as *mut i32
  26. }
  27. #[inline(always)]
  28. fn flags(args: &[usize]) -> usize {
  29. args[3]
  30. }
  31. }
  32. impl Syscall for SysPidfdSendSignalHandle {
  33. fn num_args(&self) -> usize {
  34. 4
  35. }
  36. fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result<usize, SystemError> {
  37. let pidfd = Self::pidfd(args);
  38. let sig_c_int = Self::sig(args);
  39. let _sig_info = Self::siginfo(args);
  40. let _flags = Self::flags(args);
  41. // TODO: 完整的支持此系统调用
  42. let mut pid = 0;
  43. let file = ProcessManager::current_pcb()
  44. .fd_table()
  45. .read()
  46. .get_file_by_fd(pidfd)
  47. .unwrap();
  48. if file.private_data.lock().is_pid() {
  49. pid = file.private_data.lock().get_pid();
  50. }
  51. let sig = Signal::from(sig_c_int);
  52. if sig == Signal::INVALID {
  53. // log::warn!("Pidfd_Send_Signal: Send empty sig(0)");
  54. // 这里的信号是 0, 是空信号值, 其他的信号处理是怎样的不清楚, 但是这里应该直接返回成功, 因为 0 是空信号
  55. return Ok(0);
  56. }
  57. // 应该从参数获取
  58. let mut info = SigInfo::new(
  59. sig,
  60. 0,
  61. SigCode::User,
  62. SigType::Kill(RawPid::new(pid as usize)),
  63. );
  64. let ret = sig
  65. .send_signal_info(Some(&mut info), RawPid::new(pid as usize))
  66. .map(|x| x as usize);
  67. ret
  68. }
  69. fn entry_format(&self, args: &[usize]) -> Vec<FormattedSyscallParam> {
  70. vec![
  71. FormattedSyscallParam::new("pidfd", Self::pidfd(args).to_string()),
  72. FormattedSyscallParam::new("sig", Self::sig(args).to_string()),
  73. FormattedSyscallParam::new("siginfo", format!("{:#x}", Self::siginfo(args) as usize)),
  74. FormattedSyscallParam::new("options", format!("{:#x}", Self::flags(args))),
  75. ]
  76. }
  77. }
  78. // 注册系统调用
  79. syscall_table_macros::declare_syscall!(SYS_PIDFD_SEND_SIGNAL, SysPidfdSendSignalHandle);