fcntl函数之文件锁 F_SETLK
生活随笔
收集整理的這篇文章主要介紹了
fcntl函数之文件锁 F_SETLK
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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.
總結
以上是生活随笔為你收集整理的fcntl函数之文件锁 F_SETLK的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光遇云野的钟塔遗迹怎么去
- 下一篇: fcntl函数之文件锁 F_SETLKW