From 12833a5a5ca0fe4904fce81234f1b19236ee893d Mon Sep 17 00:00:00 2001 From: Paul Sajna <paulsajna@gmail.com> Date: Thu, 8 Mar 2018 12:24:10 -0800 Subject: [PATCH] add test and fork --- src/platform/src/linux/mod.rs | 4 ++++ src/platform/src/redox/mod.rs | 4 ++++ src/unistd/src/lib.rs | 2 +- tests/.gitignore | 3 +++ tests/Makefile | 3 +++ tests/pipe.c | 23 +++++++++++++++++++++++ 6 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/pipe.c diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs index 3f32ed29..66fafabb 100644 --- a/src/platform/src/linux/mod.rs +++ b/src/platform/src/linux/mod.rs @@ -62,6 +62,10 @@ pub fn fchdir(fildes: c_int) -> c_int { e(unsafe { syscall!(FCHDIR, fildes) }) as c_int } +pub fn fork() -> pid_t { + e(unsafe {syscall!(FORK) }) as pid_t +} + pub fn fsync(fildes: c_int) -> c_int { e(unsafe { syscall!(FSYNC, fildes) }) as c_int } diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs index 95f149bd..e9fe6dda 100644 --- a/src/platform/src/redox/mod.rs +++ b/src/platform/src/redox/mod.rs @@ -66,6 +66,10 @@ pub fn fchdir(fd: c_int) -> c_int { } } +pub fn fork() -> pid_t { + e(unsafe { syscall::clone(0) }) as pid_t +} + pub fn fsync(fd: c_int) -> c_int { e(syscall::fsync(fd as usize)) as c_int } diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs index c9dc8804..ea4609ba 100644 --- a/src/unistd/src/lib.rs +++ b/src/unistd/src/lib.rs @@ -140,7 +140,7 @@ pub extern "C" fn fdatasync(fildes: c_int) -> c_int { #[no_mangle] pub extern "C" fn fork() -> pid_t { - unimplemented!(); + platform::fork() } #[no_mangle] diff --git a/tests/.gitignore b/tests/.gitignore index dead47ff..e5819ec5 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,9 +1,11 @@ /alloc /args +/atoi /brk /chdir /create /create.out +/ctype /dup /dup.out /error @@ -15,5 +17,6 @@ /link /link.out /math +/pipe /printf /write diff --git a/tests/Makefile b/tests/Makefile index 7d293f72..b371961d 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,9 +1,11 @@ BINS=\ alloc \ + atoi \ brk \ args \ chdir \ create \ + ctype \ dup \ error \ fchdir \ @@ -12,6 +14,7 @@ BINS=\ getid \ link \ math \ + pipe \ printf \ write diff --git a/tests/pipe.c b/tests/pipe.c new file mode 100644 index 00000000..0ad78bc3 --- /dev/null +++ b/tests/pipe.c @@ -0,0 +1,23 @@ +//http://www2.cs.uregina.ca/~hamilton/courses/330/notes/unix/pipes/pipes.html +#include <unistd.h> + +int main() +{ + + int pid, pip[2]; + char instring[20]; + + pipe(pip); + + pid = fork(); + if (pid == 0) /* child : sends message to parent*/ + { + /* send 7 characters in the string, including end-of-string */ + write(pip[1], "Hi Mom!", 7); + } + else /* parent : receives message from child */ + { + /* read from the pipe */ + read(pip[0], instring, 7); + } +} -- GitLab