/* * @descriptor:主进程创建listenfd,子进程创建connfd,次用文件锁方式保证子进程中的accept并发安全 */ void my_lock_init(char *filename) { char lock_file[1024]; strncpy(lock_file,filename,sizeof(lock_file)); //创建一个零时文件 Mktemp(lock_file); fd = open(lock_file,O_CREAT | O_WRONLY,FILE_MODE); unlink(lock_file); bzero(lock_it,sizeof(struct flock)); bzero(unlock_it,sizeof(struct flock)); lock_it.l_type = F_WRLCK; lock_it.l_wheel = SEEK_SET; lock_it.l_start = 0; lock_it.l_len = 0; unlock_it.l_type = F_UNLCK; unlock_it.l_wheel = SEEK_SET; unlock_it.l_start = 0; unlock_it.l_len = 0; }
char *Mktemp(const char *base) { static char id[16] = "AAAAAAAAAAAAAAA"; char *p1,*p2,*st; if ((st = malloc(strlen(base) + 1)) == NULL) { fprintf(stderr,"%s: memory allocation failure\n", program_name); exit (EXIT_FAILURE); } st = strcpy(st,base); if (*st == '\0') { free (st); if ((st = strdup("TXXXXXXX")) == NULL) { fprintf(stderr,"%s: memory allocation failure\n", program_name); exit (EXIT_FAILURE); } } /* Replace all "X" with part of ID string */ for(p1 = st + strlen(st) - 1,p2 = &id[14]; p1 >= st && p2 >= id && *p1 == 'X'; p1--,p2--) *p1 = *p2; /* Update ID string to "count" one further */ for(p1 = &id[14];p1 >= id;) if(*p1 == 'Z') { *p1 = 'A'; p1--; } else { *p1 += 1; break; } /* Make sure the file name does not already exist */ #ifdef __GNO__ if (needsgno() == TRUE) { #endif if (stat(st,&tstat) == 0) { free (st); st = Mktemp (base); } #ifdef __GNO__ } else { /* ORCA/Shell doesn't like stat one little bit */ FILE *fp; if ((fp = fopen(st,"r")) != NULL) { fclose(fp); free (st); st = Mktemp (base); } else if ((fp = fopen(st,"a")) == NULL) { free(st); st = Mktemp (base); } else { fclose(fp); } } #endif /* __GNO__ */ return st; }