forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
/* This is a test case where the parent process forks 10
 | 
						|
 * children which contend to write to the same file. With
 | 
						|
 * file locking support, the data from each child should not
 | 
						|
 * be lost.
 | 
						|
 */
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <sys/wait.h>
 | 
						|
 | 
						|
extern FILE *lprofOpenFileEx(const char *);
 | 
						|
int main(int argc, char *argv[]) {
 | 
						|
  pid_t tid;
 | 
						|
  FILE *F;
 | 
						|
  const char *FN;
 | 
						|
  int child[10];
 | 
						|
  int c;
 | 
						|
  int i;
 | 
						|
 | 
						|
  if (argc < 2) {
 | 
						|
    fprintf(stderr, "Requires one argument \n");
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
  FN = argv[1];
 | 
						|
  truncate(FN, 0);
 | 
						|
 | 
						|
  for (i = 0; i < 10; i++) {
 | 
						|
    c = fork();
 | 
						|
    // in child: 
 | 
						|
    if (c == 0) {
 | 
						|
      FILE *F = lprofOpenFileEx(FN);
 | 
						|
      if (!F) {
 | 
						|
        fprintf(stderr, "Can not open file %s from child\n", FN);
 | 
						|
        exit(1);
 | 
						|
      }
 | 
						|
      fseek(F, 0, SEEK_END);
 | 
						|
      fprintf(F, "Dump from Child %d\n", i);
 | 
						|
      fclose(F);
 | 
						|
      exit(0);
 | 
						|
    } else {
 | 
						|
      child[i] = c;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  // In parent
 | 
						|
  for (i = 0; i < 10; i++) {
 | 
						|
    int child_status;
 | 
						|
    if ((tid = waitpid(child[i], &child_status, 0)) == -1)
 | 
						|
      break;
 | 
						|
  }
 | 
						|
  F = lprofOpenFileEx(FN);
 | 
						|
  if (!F) {
 | 
						|
    fprintf(stderr, "Can not open file %s from parent\n", FN);
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
  fseek(F, 0, SEEK_END);
 | 
						|
  fprintf(F, "Dump from parent %d\n", i);
 | 
						|
  return 0;
 | 
						|
}
 |