#include<stdio.h>#include<string.h>#include<unistd.h>#include<fcntl.h>#include<errno.h>/**
*
*./myfcntl content typestruct 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)...};*
*/intlock_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());}elseif(lock_type == F_UNLCK){printf("unlock by %d.\n",getpid());}return0;}intreg_lock(int fd){returnlock_reg(fd, F_SETLK, F_WRLCK,0,SEEK_SET,0);}intreg_unlock(int fd){returnlock_reg(fd, F_SETLK, F_UNLCK,0,SEEK_SET,0);}intreg_lockw(int fd){returnlock_reg(fd, F_SETLKW, F_WRLCK,0,SEEK_SET,0);}intreg_unlockw(int fd){returnlock_reg(fd, F_SETLKW, F_UNLCK,0,SEEK_SET,0);}/*
*
*.myfcntl AAAAAA
*/intmain(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_lockw(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_unlockw(fd);if(ret !=0){return-1;}close(fd);return0;}
同時運行兩個進程,第二個被阻塞不退出,直到第一個進程解鎖,第二個進程再上鎖。 #結果 lock by 18687. B:out by pid 18687. B:out by pid 18687. B:out by pid 18687. B:out by pid 18687. B:out by pid 18687. B:out by pid 18687. B:out by pid 18687. unlock by 18687. lock by 18686. A:out by pid 18686. A:out by pid 18686. A:out by pid 18686. A:out by pid 18686. A:out by pid 18686. A:out by pid 18686. A:out by pid 18686. unlock by 18686. fcntl分為建議鎖和強制性鎖,默認是建議鎖模式,該模式下,一個文件被一個進程鎖住后,第二個進程是能直接往這個文件寫數據的。建議每次輸入數據前都有個上鎖操作。