增加多进程测试用户程序,
parent
bef8691ce0
commit
7a2a0ff5bc
@ -0,0 +1,29 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
|
||||
|
||||
use user_lib::*;
|
||||
use syscall::{sys_fork, };
|
||||
use user_lib::syscall::sys_getpid;
|
||||
|
||||
#[no_mangle]
|
||||
pub fn main() -> i32 {
|
||||
assert_eq!(wait(&mut 0i32), -1);
|
||||
println!("sys_wait without child process test passed!");
|
||||
println!("parent start, pid = {}!", sys_getpid());
|
||||
let pid = sys_fork();
|
||||
if pid == 0 {
|
||||
// child process
|
||||
println!("hello child process!");
|
||||
100
|
||||
} else {
|
||||
// parent process
|
||||
let mut exit_code: i32 = 0;
|
||||
println!("ready waiting on parent process!");
|
||||
assert_eq!(pid, wait(&mut exit_code));
|
||||
assert_eq!(exit_code, 100);
|
||||
println!("child process pid = {}, exit code = {}", pid, exit_code);
|
||||
0
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use user_lib::*;
|
||||
use syscall::{sys_fork, sys_getpid, sys_yield};
|
||||
use user_lib::syscall::sys_exit;
|
||||
|
||||
const DEPTH: usize = 4;
|
||||
|
||||
fn fork_child(cur: &str, branch: char) {
|
||||
let mut next = [0u8; DEPTH + 1];
|
||||
let l = cur.len();
|
||||
if l >= DEPTH {
|
||||
return;
|
||||
}
|
||||
next[..l].copy_from_slice(cur.as_bytes());
|
||||
next[l] = branch as u8;
|
||||
if sys_fork() == 0 {
|
||||
fork_tree(core::str::from_utf8(&next[..l + 1]).unwrap());
|
||||
sys_yield();
|
||||
sys_exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
fn fork_tree(cur: &str) {
|
||||
println!("pid{}: {}", sys_getpid(), cur);
|
||||
fork_child(cur, '0');
|
||||
fork_child(cur, '1');
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn main() -> i32 {
|
||||
fork_tree("");
|
||||
sleep(3000);
|
||||
0
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
#![allow(clippy::needless_range_loop)]
|
||||
|
||||
use user_lib::*;
|
||||
use syscall::{sys_fork, sys_getpid, sys_yield};
|
||||
use user_lib::syscall::{sys_exit, sys_get_time};
|
||||
|
||||
|
||||
static NUM: usize = 30;
|
||||
const N: usize = 10;
|
||||
static P: i32 = 10007;
|
||||
type Arr = [[i32; N]; N];
|
||||
|
||||
fn work(times: isize) {
|
||||
let mut a: Arr = Default::default();
|
||||
let mut b: Arr = Default::default();
|
||||
let mut c: Arr = Default::default();
|
||||
for i in 0..N {
|
||||
for j in 0..N {
|
||||
a[i][j] = 1;
|
||||
b[i][j] = 1;
|
||||
}
|
||||
}
|
||||
sys_yield();
|
||||
println!("pid {} is running ({} times)!.", sys_getpid(), times);
|
||||
for _ in 0..times {
|
||||
for i in 0..N {
|
||||
for j in 0..N {
|
||||
c[i][j] = 0;
|
||||
#[allow(clippy::needless_range_loop)]
|
||||
for k in 0..N {
|
||||
c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % P;
|
||||
}
|
||||
}
|
||||
}
|
||||
for i in 0..N {
|
||||
for j in 0..N {
|
||||
a[i][j] = c[i][j];
|
||||
b[i][j] = c[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
println!("pid {} done!.", sys_getpid());
|
||||
sys_exit(0);
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn main() -> i32 {
|
||||
for _ in 0..NUM {
|
||||
let pid = sys_fork();
|
||||
if pid == 0 {
|
||||
let current_time = sys_get_time();
|
||||
let times = (current_time as i32 as isize) * (current_time as i32 as isize) % 1000;
|
||||
work(times * 10);
|
||||
}
|
||||
}
|
||||
|
||||
println!("fork ok.");
|
||||
|
||||
let mut exit_code: i32 = 0;
|
||||
for _ in 0..NUM {
|
||||
if wait(&mut exit_code) < 0 {
|
||||
panic!("wait failed.");
|
||||
}
|
||||
}
|
||||
assert!(wait(&mut exit_code) < 0);
|
||||
println!("matrix passed.");
|
||||
0
|
||||
}
|
Loading…
Reference in New Issue