diff --git a/.gitignore b/.gitignore index 8cf52cf2..1eeb2325 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ tools/make_initrd tools/scc_bootinfo.asm newlib/examples/hello newlib/examples/memtest +newlib/examples/fork newlib/examples/jacobi newlib/examples/echo newlib/examples/tests diff --git a/apps/memory.c b/apps/memory.c index f6945e59..1926db2b 100644 --- a/apps/memory.c +++ b/apps/memory.c @@ -307,9 +307,9 @@ int memory(void* arg) malloc(); kprintf("======== USER: test userspace...\n"); - char* argv[] = {"/bin/memtest", "17", "kb", "5", NULL}; + char* argv[] = {"/bin/fork", NULL}; ret = create_user_task(&id, argv[0], argv); - test(!ret, "calling %s %s %s %s with id = %i:\n", argv[0], argv[1], argv[2], argv[3], id); + test(!ret, "calling %s with id = %i, ret = %i", argv[0], id, ret); wait(&ret); test(!ret, "userspace task returned with code = %d", ret); diff --git a/newlib/examples/Makefile b/newlib/examples/Makefile index 4bde5a44..972ed00c 100644 --- a/newlib/examples/Makefile +++ b/newlib/examples/Makefile @@ -11,7 +11,7 @@ LDFLAGS = default: all -all: memtest hello tests jacobi mshell server client rlogind +all: memtest hello tests jacobi mshell server client rlogind fork jacobi: jacobi.o $(CC_FOR_TARGET) -T link.ld -o $@ $(LDFLAGS) $< -lm @@ -24,7 +24,13 @@ memtest: memtest.o $(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $@ $@.sym $(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@ chmod a-x $@.sym - + +fork: fork.o + $(CC_FOR_TARGET) -T link.ld -o $@ $(LDFLAGS) $< + $(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $@ $@.sym + $(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@ + chmod a-x $@.sym + tests: tests.o $(CC_FOR_TARGET) -T link.ld -o $@ $(LDFLAGS) $< $(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $@ $@.sym diff --git a/newlib/examples/fork.c b/newlib/examples/fork.c new file mode 100644 index 00000000..daa4047d --- /dev/null +++ b/newlib/examples/fork.c @@ -0,0 +1,55 @@ +/* + * Copyright 2013 Steffen Vogel, Chair for Operating Systems, + * RWTH Aachen University + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is part of MetalSVM. + */ + +#include +#include +#include +#include +#include +#include + +int main(int argc, char** argv) +{ + printf("======== USER: test forking...\n"); + + int id = fork(); + int ret = 0; + + if (id < 0) { + perror(" PARENT: fork"); + exit(-1); + } + else if (id == 0) { + printf(" CHILD: This is the child. My pid is %u\n", getpid()); + printf(" CHILD: Running memtest...\n"); + + const char *argv[] = {"/bin/memtest", "512", "kb", "10", NULL}; + execve(argv[0], argv, NULL); + perror(" CHILD: exec() returned: "); + ret = -1; + } + else { + printf(" PARENT: Here is the parent. My pid is %u\n", getpid()); + + wait(&ret); + printf(" PARENT: My child returned with code %i...\n", ret); + } + + return ret; +}