📄 fcntl_lock64.c
字号:
/* test whether 64 bit fcntl locking really works on this system */#if defined(HAVE_UNISTD_H)#include <unistd.h>#endif#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#ifdef HAVE_FCNTL_H#include <fcntl.h>#endif#ifdef HAVE_SYS_FCNTL_H#include <sys/fcntl.h>#endif#include <errno.h>#define DATA "conftest.fcntl64"/* lock a byte range in a open file */int main(int argc, char *argv[]){ struct flock64 lock; int fd, ret, status=1; pid_t pid; if (!(pid=fork())) { sleep(2); fd = open64(DATA, O_RDONLY); if (fd == -1) exit(1); lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 4; lock.l_pid = getpid(); lock.l_type = F_WRLCK; /* check if a lock applies */ ret = fcntl(fd,F_GETLK64,&lock); if ((ret == -1) || (lock.l_type == F_UNLCK)) {/* printf("No lock conflict\n"); */ exit(1); } else {/* printf("lock conflict\n"); */ exit(0); } } fd = open64(DATA, O_RDWR|O_CREAT|O_TRUNC, 0600); lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET;#if defined(COMPILER_SUPPORTS_LL) lock.l_start = 0x100000000LL;#else lock.l_start = 0x100000000;#endif lock.l_len = 4; lock.l_pid = getpid(); /* set a 4 byte write lock */ fcntl(fd,F_SETLK64,&lock); sys_waitpid(pid, &status, 0);#if defined(WIFEXITED) && defined(WEXITSTATUS) if(WIFEXITED(status)) { status = WEXITSTATUS(status); } else { status = 1; }#else /* defined(WIFEXITED) && defined(WEXITSTATUS) */ status = (status == 0) ? 0 : 1;#endif /* defined(WIFEXITED) && defined(WEXITSTATUS) */ unlink(DATA); exit(status);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -