added userspace testcase for fork() and execve() syscalls
This commit is contained in:
parent
e740cf265e
commit
c70c488336
4 changed files with 66 additions and 4 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
55
newlib/examples/fork.c
Normal file
55
newlib/examples/fork.c
Normal file
|
@ -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 <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Add table
Reference in a new issue