1 /* This is a test case where the parent process forks 10
2  * children which contend to write to the same file. With
3  * file locking support, the data from each child should not
4  * be lost.
5  */
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <sys/wait.h>
10 
11 extern FILE *lprofOpenFileEx(const char *);
main(int argc,char * argv[])12 int main(int argc, char *argv[]) {
13   pid_t tid;
14   FILE *F;
15   const char *FN;
16   int child[10];
17   int c;
18   int i;
19 
20   if (argc < 2) {
21     fprintf(stderr, "Requires one argument \n");
22     exit(1);
23   }
24   FN = argv[1];
25   truncate(FN, 0);
26 
27   for (i = 0; i < 10; i++) {
28     c = fork();
29     // in child:
30     if (c == 0) {
31       FILE *F = lprofOpenFileEx(FN);
32       if (!F) {
33         fprintf(stderr, "Can not open file %s from child\n", FN);
34         exit(1);
35       }
36       fseek(F, 0, SEEK_END);
37       fprintf(F, "Dump from Child %d\n", i);
38       fclose(F);
39       exit(0);
40     } else {
41       child[i] = c;
42     }
43   }
44 
45   // In parent
46   for (i = 0; i < 10; i++) {
47     int child_status;
48     if ((tid = waitpid(child[i], &child_status, 0)) == -1)
49       break;
50   }
51   F = lprofOpenFileEx(FN);
52   if (!F) {
53     fprintf(stderr, "Can not open file %s from parent\n", FN);
54     exit(1);
55   }
56   fseek(F, 0, SEEK_END);
57   fprintf(F, "Dump from parent %d\n", i);
58   return 0;
59 }
60