/proc是一个特殊的文件系统。 该目录下文件用来表示与启动、内核相关的特殊信息。
可修改该文件
用法
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
参数
struct flock { short l_type; /*F_RDLCK, F_WRLCK, or F_UNLCK */ off_t l_start; /*offset in bytes, relative to l_whence */ short l_whence; /*SEEK_SET, SEEK_CUR, or SEEK_END */ off_t l_len; /*length, in bytes; 0 means lock to EOF */ pid_t l_pid; /*returned with F_GETLK */ };
示例:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILE_NAME "flock_demo.txt"
int flock_set(int fd, int type) {
printf("pid=%d come in.\n",getpid());
struct flock fflock;
memset(&fflock, 0, sizeof(fflock));
fcntl(fd,F_GETLK,&fflock);
if (fflock.l_type != F_UNLCK) {
if (fflock.l_type == F_RDLCK) {//有锁,判断是读锁还是写锁
printf("flock has been set to read lock by %d\n",fflock.l_pid);
} else if (fflock.l_type == F_WRLCK) {
printf("flock has been set to write lock by %d\n", fflock.l_pid);
}
}
//锁定文件
fflock.l_type = type;
fflock.l_whence = SEEK_SET;
fflock.l_start = 0;
fflock.l_len = 0;
fflock.l_pid = -1;
//阻塞式的
if (fcntl(fd,F_SETLKW,&fflock) < 0) {
printf("set lock failed!\n");
return -1;
}
switch (fflock.l_type) {
case F_RDLCK:
printf("read lock is set by %d\n", getpid());
break;
case F_WRLCK:
printf("write lock is set by %d\n", getpid());
break;
case F_UNLCK:
printf("lock is released by %d\n", getpid());
break;
default:
break;
}
printf("Process pid = %d out.\n",getpid());
return 0;
}
int main(void) {
int fd = 0;
fd = open(FILE_NAME, O_RDWR | O_CREAT, 0666);
if (fd < 0) {
printf("open file %s failed!\n",FILE_NAME);
exit(-1);
}
//flock_set(fd, F_RDLCK); //读锁
flock_set(fd, F_WRLCK); //写锁
getchar();
flock_set(fd, F_UNLCK); //解锁
getchar();
close(fd);
return 0;
}