- 论坛徽章:
- 0
|
参考
static int lockfile( char *filename, LKHANDLE *lock )
{
#ifdef _OS_WINDOWS
BOOL brc;
DWORD drc;
int rc;
if( lock == NULL ){
return -1;
}
( void )memset( lock, 0, sizeof( *lock ));
if( filename == NULL ){
return -1;
}
lock->hd = CreateFile( filename,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL );
if(lock->hd == INVALID_HANDLE_VALUE){
lock->hd = NULL;
return -1;
}
brc = LockFile( lock->hd, 0, 0, 1, 0);
if(brc != TRUE){
drc = GetLastError();
if( drc == ERROR_LOCK_VIOLATION ){
rc = 1;
} else {
rc = -1;
}
CloseHandle( lock->hd );
lock->hd = NULL;
return rc;
}
( void )strncpy( lock->pathname, filename, sizeof( lock->pathname ) - 1 );
return 0;
#else
int rc;
if( lock == NULL ){
return -1;
}
( void )memset( lock, 0, sizeof( *lock ));
lock->fd = -1;
if( filename == NULL ){
return -1;
}
lock->fd = open( filename, O_RDWR|O_CREAT, 0600);
if( lock->fd < 0 ){
return -1;
}
rc = lockf( lock->fd, F_TLOCK, 1 );
if( rc != 0 ){
#if defined(_OS_HPUX) || defined(_OS_AIX)
if( errno == EACCES ){
#else /* Solaris、Linux */
if( errno == EAGAIN ){
#endif
rc = 1;
} else {
rc = -1;
}
close( lock->fd );
lock->fd = -1;
return rc;
}
( void )strncpy( lock->pathname, filename, sizeof( lock->pathname ) - 1 );
return 0;
#endif
} /* lockfile() */ |
|