summaryrefslogtreecommitdiff
path: root/user/forktest.c
diff options
context:
space:
mode:
Diffstat (limited to 'user/forktest.c')
-rw-r--r--user/forktest.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/user/forktest.c b/user/forktest.c
new file mode 100644
index 0000000..be4915e
--- /dev/null
+++ b/user/forktest.c
@@ -0,0 +1,56 @@
+// Test that fork fails gracefully.
+// Tiny executable so that the limit can be filling the proc table.
+
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
+
+#define N 1000
+
+void
+printf(int fd, const char *s, ...)
+{
+ write(fd, s, strlen(s));
+}
+
+void
+forktest(void)
+{
+ int n, pid;
+
+ printf(1, "fork test\n");
+
+ for(n=0; n<N; n++){
+ pid = fork();
+ if(pid < 0)
+ break;
+ if(pid == 0)
+ exit();
+ }
+
+ if(n == N){
+ printf(1, "fork claimed to work N times!\n", N);
+ exit();
+ }
+
+ for(; n > 0; n--){
+ if(wait() < 0){
+ printf(1, "wait stopped early\n");
+ exit();
+ }
+ }
+
+ if(wait() != -1){
+ printf(1, "wait got too many\n");
+ exit();
+ }
+
+ printf(1, "fork test OK\n");
+}
+
+int
+main(void)
+{
+ forktest();
+ exit();
+}