#include <stdio.h> #include <fcntl.h> #define TRUE 1 #define FALSE 0 extern int errno; char plane[]="plane_reserve"; char hotel[]="hotel_reserve"; void usage(char *myself) { fprintf(stderr,"Usage: %s -f file",myself); } int reserve(FILE *fp); int main(int ac,char *av[]) { int plane_fd,hotel_fd,result; pid_t pid; FILE *plane_fp,*hotel_fp; pid = getpid(); if ((plane_fp = fopen(plane, "r+")) == NULL) { (void)fprintf(stderr, "%d can't open %s\n", pid, plane, strerror(errno)); exit(1); } plane_fd = fileno(plane_fp); if ((hotel_fp = fopen(hotel, "r+") )== NULL ) { (void)fprintf(stderr, "%d can't open %s\n", pid, hotel, strerror(errno)); exit(1); } hotel_fd = fileno(hotel_fp); /* // LOCK_SH shared file lock // LOCK_EX exclusive file lock // LOCK_NB don't block when locking // LOCK_UN unlock file */ if( flock(plane_fd, LOCK_EX) != 0) { fprintf(stderr,"%d flock error: %s\n",pid, strerror(errno)); exit(1); } result = reserve(plane_fp); fclose(plane_fp); /* and release lock */ if(result) { fprintf(stderr,"%d reserve %s\n",pid,plane); } else { fprintf(stderr,"%d cannot reserve %s\n",pid,plane); exit(1); } if( flock(hotel_fd, LOCK_EX) != 0) { fprintf(stderr,"%d flock error: %s\n",pid, strerror(errno)); exit(1); } result = reserve(hotel_fp); if(result) { fprintf(stderr,"%d reserve %s\n",pid,hotel); } else { fprintf(stderr,"%d cannot reserve %s\n",pid,hotel); exit(1); } fclose(hotel_fp); /* and release lock */ exit(0); } int reserve(FILE *fp) { int remain; char buf[BUFSIZ]; if(fgets(buf,BUFSIZ,fp)) { remain = atoi(buf); if(remain>0) { fseek(fp, 0L, SEEK_SET); fprintf(fp,"%d\n",--remain); return TRUE; } } return FALSE; }