fcntl函数之文件锁 F_SETLK
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>/**
*
*./myfcntl contentstruct flock {...short l_type; F_RDLCK,F_WRLCK,F_UNLCKshort l_whence; How to interpret l_start: SEEK_SET, SEEK_CUR, SEEK_ENDoff_t l_start; Starting offset for lockoff_t l_len; Number of bytes to lockpid_t l_pid; PID of process blocking our lock (set by F_GETLK and F_OFD_GETLK)...};*
*/
int lock_reg(int fd, int cmd, short lock_type, short lock_whence, off_t lock_start, off_t lock_len)
{struct flock lock;lock.l_type = lock_type;lock.l_whence = lock_whence;lock.l_start = lock_start;lock.l_len = lock_len;lock.l_pid = getpid();if (fcntl(fd, cmd, &lock) < 0) {if (errno == EACCES || errno == EAGAIN ) {printf("file lock by other processes.\n");return -1;}printf("lock file fail.\n");return -1;}if (lock_type == F_WRLCK) {printf("lock by %d.\n", getpid());} else if (lock_type == F_UNLCK) {printf("unlock by %d.\n", getpid());}return 0;
}int reg_lock(int fd)
{return lock_reg(fd, F_SETLK, F_WRLCK, 0, SEEK_SET, 0);
}
int reg_unlock(int fd)
{return lock_reg(fd, F_SETLK, F_UNLCK, 0, SEEK_SET, 0);
}/*
*
*.myfcntl AAAAAA
*/
int main(int argv, char *argc[])
{char *buf;int i;int ret;int fd;if (argv < 2) {printf("argc error!\n");return -1;}fd = open("processes.txt", O_CREAT|O_RDWR|O_APPEND, 777);ret = reg_lock(fd);if (ret !=0 ) {return -1;}sleep(5);buf = argc[1];i = 0;while (i < strlen(buf)) {if (write(fd, buf+i, sizeof(char)) < sizeof(char)) {printf("printf out error!\n");return -1;}printf(" %c:out by pid %d.\n", buf[i], getpid());i++;sleep(1);}ret = reg_unlock(fd);if (ret !=0 ) {return -1;}close(fd);return 0;
}
在不同终端下,同时运行程序。第二个进程直接提示退出。
lock by 18709.
file lock by other processes.
B:out by pid 18709.
B:out by pid 18709.
B:out by pid 18709.
B:out by pid 18709.
B:out by pid 18709.
B:out by pid 18709.
B:out by pid 18709.
unlock by 18709.