xref: /xv6-public/forktest.c (revision 308a3b88)
1e0e7d07eSrsc // Test that fork fails gracefully.
2e0e7d07eSrsc // Tiny executable so that the limit can be filling the proc table.
3e0e7d07eSrsc 
4e0e7d07eSrsc #include "types.h"
5e0e7d07eSrsc #include "stat.h"
6e0e7d07eSrsc #include "user.h"
7e0e7d07eSrsc 
840889627SFrans Kaashoek #define N  1000
940889627SFrans Kaashoek 
10e0e7d07eSrsc void
printf(int fd,const char * s,...)11*308a3b88SFrans Kaashoek printf(int fd, const char *s, ...)
12e0e7d07eSrsc {
13e0e7d07eSrsc   write(fd, s, strlen(s));
14e0e7d07eSrsc }
15e0e7d07eSrsc 
16e0e7d07eSrsc void
forktest(void)17e0e7d07eSrsc forktest(void)
18e0e7d07eSrsc {
19e0e7d07eSrsc   int n, pid;
20e0e7d07eSrsc 
21e0e7d07eSrsc   printf(1, "fork test\n");
22e0e7d07eSrsc 
2340889627SFrans Kaashoek   for(n=0; n<N; n++){
24e0e7d07eSrsc     pid = fork();
25e0e7d07eSrsc     if(pid < 0)
26e0e7d07eSrsc       break;
27e0e7d07eSrsc     if(pid == 0)
28e0e7d07eSrsc       exit();
29e0e7d07eSrsc   }
30e0e7d07eSrsc 
3140889627SFrans Kaashoek   if(n == N){
3240889627SFrans Kaashoek     printf(1, "fork claimed to work N times!\n", N);
33e0e7d07eSrsc     exit();
34e0e7d07eSrsc   }
35e0e7d07eSrsc 
36e0e7d07eSrsc   for(; n > 0; n--){
37e0e7d07eSrsc     if(wait() < 0){
38e0e7d07eSrsc       printf(1, "wait stopped early\n");
39e0e7d07eSrsc       exit();
40e0e7d07eSrsc     }
41e0e7d07eSrsc   }
42e0e7d07eSrsc 
43e0e7d07eSrsc   if(wait() != -1){
44e0e7d07eSrsc     printf(1, "wait got too many\n");
45e0e7d07eSrsc     exit();
46e0e7d07eSrsc   }
47e0e7d07eSrsc 
48e0e7d07eSrsc   printf(1, "fork test OK\n");
49e0e7d07eSrsc }
50e0e7d07eSrsc 
51e0e7d07eSrsc int
main(void)52e0e7d07eSrsc main(void)
53e0e7d07eSrsc {
54e0e7d07eSrsc   forktest();
55e0e7d07eSrsc   exit();
56e0e7d07eSrsc }
57