Exemplo n.º 1
0
/*
 * @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;
}
Exemplo n.º 2
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;
}