mirror of
https://github.com/rcore-os/rCore.git
synced 2024-11-21 23:56:18 +04:00
Fix sys_kill and add killtest
This commit is contained in:
parent
17c08ce26c
commit
b7aee438db
@ -82,7 +82,7 @@ pub fn syscall(id: usize, args: [usize; 6], tf: &mut TrapFrame) -> isize {
|
||||
059 => sys_exec(args[0] as *const u8, args[1] as *const *const u8, args[2] as *const *const u8, tf),
|
||||
060 => sys_exit(args[0] as usize),
|
||||
061 => sys_wait4(args[0] as isize, args[1] as *mut i32), // TODO: wait4
|
||||
062 => sys_kill(args[0]),
|
||||
062 => sys_kill(args[0], args[1]),
|
||||
063 => sys_uname(args[0] as *mut u8),
|
||||
// 072 => sys_fcntl(),
|
||||
074 => sys_fsync(args[0]),
|
||||
|
@ -146,13 +146,35 @@ pub fn sys_yield() -> SysResult {
|
||||
}
|
||||
|
||||
/// Kill the process
|
||||
pub fn sys_kill(pid: usize) -> SysResult {
|
||||
info!("{} killed: {}", thread::current().id(), pid);
|
||||
processor().manager().exit(pid, 0x100);
|
||||
if pid == thread::current().id() {
|
||||
processor().yield_now();
|
||||
pub fn sys_kill(pid: usize, sig: usize) -> SysResult {
|
||||
info!("kill: {} killed: {} with sig {}", thread::current().id(), pid, sig);
|
||||
let current_pid = process().pid.get().clone();
|
||||
if current_pid == pid {
|
||||
// killing myself
|
||||
sys_exit_group(sig);
|
||||
Ok(0)
|
||||
} else {
|
||||
if let Some(proc_arc) = PROCESSES.read().get(&pid).and_then(|weak| weak.upgrade()) {
|
||||
let proc = proc_arc.lock();
|
||||
// quit all threads
|
||||
for tid in proc.threads.iter() {
|
||||
processor().manager().exit(*tid, sig);
|
||||
}
|
||||
// notify parent and fill exit code
|
||||
// avoid deadlock
|
||||
let proc_parent = proc.parent.clone();
|
||||
let pid = proc.pid.get();
|
||||
drop(proc);
|
||||
if let Some(parent) = proc_parent {
|
||||
let mut parent = parent.lock();
|
||||
parent.child_exit_code.insert(pid, sig);
|
||||
parent.child_exit.notify_one();
|
||||
}
|
||||
Ok(0)
|
||||
} else {
|
||||
Err(SysError::EINVAL)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the current process id
|
||||
|
@ -5,8 +5,8 @@ sleep 2
|
||||
expect ">>"
|
||||
sleep 2
|
||||
send -- "biscuit/fork\r"
|
||||
sleep 2
|
||||
sleep 5
|
||||
expect "hello from 100"
|
||||
expect "parent done!"
|
||||
send -- "^Ax"
|
||||
wait -nowait
|
||||
wait
|
||||
|
11
tests/killtest.exp
Normal file
11
tests/killtest.exp
Normal file
@ -0,0 +1,11 @@
|
||||
set timeout -1
|
||||
cd ../kernel
|
||||
spawn make run arch=x86_64
|
||||
sleep 2
|
||||
expect ">>"
|
||||
sleep 2
|
||||
send -- "biscuit/killtest\r"
|
||||
sleep 2
|
||||
expect "success"
|
||||
send -- "^Ax"
|
||||
wait
|
2
user
2
user
@ -1 +1 @@
|
||||
Subproject commit 091b95fae21bf42c8ee403056bda830f65255286
|
||||
Subproject commit 095cfa8e66792544e491945eec18daad3e6d58b3
|
Loading…
Reference in New Issue
Block a user