/* ----------- incr.c -------------*/ # include # include # include # include # include #define SEQFILE "seqno" /*filename*/ #define MAXBUF 100 #define MAXDELAY 5 #define MAXREPEAT 10 /* Locking routines for System V */ void my_lock(int fd) { /* rewind before lockf: */ lseek(fd, 0L, 0); if (lockf(fd, F_LOCK, 0L) == -1 ) /* 0L -> lock entire file */ perror("can't lock"); return; } //my_lock() void my_unlock(int fd) { lseek(fd, 0L, 0); if ( lockf(fd, F_ULOCK, 0L) == -1 ) perror("can't unlock"); return; } int incr(int delay) { int fd, n, seqno; char buffer[MAXBUF + 1]; if ( (fd = open(SEQFILE,O_RDWR) ) < 0 ) { perror("SEQFILE"); return -1; } my_lock(fd); /* rewind before read: */ lseek(fd, 0L, 0); if ( (n = read(fd, buffer, MAXBUF) ) <= 0) { perror("read"); return -1; } buffer[n] = '\0'; if ( (n = sscanf(buffer, "%d\n", &seqno)) != 1) { fprintf(stderr, "sscanf error\n"); return -1; } seqno++; sprintf(buffer, "%03d\n", seqno); n = strlen(buffer); /* wait delay sec */ sleep(delay % MAXDELAY); /* rewind before write: */ lseek(fd,0L,0); if (write(fd, buffer, n) != n) { perror("write"); return -1; } my_unlock(fd); close(fd); return 0; } char increment(int start, int end, int maxduration) { int delay, current=start; char totalCalculationTime=0; srandom(time(0)); delay = random(); while ( (current <= end) && incr(delay) == 0 ) { sleep(delay = random() % MAXDELAY); totalCalculationTime+=delay; fprintf(stderr, "long running increment within process %d took %d seconds\n", getpid(), delay); current++; } //while return (totalCalculationTime); }// increment int main() { int pid1, pid2, i, status, delay; switch(pid1 = fork()){ case -1: perror("fork"); exit(1); case 0: printf("process %d will wait one moment...\n",getpid() ); srandom(time(0)); sleep(1+ random() % MAXDELAY ); //fprintf(stderr, "waiting %d seconds before starting action within process %d\n", delay=(1+ random() % MAXDELAY), getpid() ); fprintf(stderr, "process %d needed %d seconds for calculation\n",getpid(), increment(1,MAXREPEAT,MAXDELAY) ); exit(0); default: break; } fprintf(stderr,"forking again...\n"); switch(pid2 = fork()){ case -1: perror("fork"); exit(1); case 0: printf("second process (%d) is running!\n",getpid()); fprintf(stderr, "process %d needed %d seconds for calculation\n",getpid(), increment(1,MAXREPEAT,MAXDELAY) ); exit(0); default: break; } printf("Child %d terminated\n", wait(&status)); printf("Child %d terminated\n", wait(&status)); exit(0); }