#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int wlock(int fd, int wait) {
struct flock lock;
// 操作类型 F_RDLCK 读锁, F_WRLCK 写锁, or F_UNLCK 解锁
lock.l_type = F_WRLCK;
// 相对哪个位置 SEEK_SET 开头位置 SEEK_CUR 当前位置 末尾 SEEK_END
lock.l_whence = SEEK_SET;
// 偏移多少
lock.l_start = 0;
// 多少长度 0 表示整个文件
lock.l_len = 0;
//哪个进程给文件加锁 -1表示当前进程
lock.l_pid = -1;
return fcntl(fd, wait ? F_SETLKW : F_SETLK, &lock);
}
int unlock(int fd) {
struct flock lock;
// 操作类型 F_RDLCK 读锁, F_WRLCK 写锁, or F_UNLCK 解锁
lock.l_type = F_UNLCK;
// 相对哪个位置 SEEK_SET 开头位置 SEEK_CUR 当前位置 末尾 SEEK_END
lock.l_whence = SEEK_SET;
// 偏移多少
lock.l_start = 0;
// 多少长度 0 表示整个文件
lock.l_len = 0;
//哪个进程给文件解锁 -1表示当前进程
lock.l_pid = -1;
return fcntl(fd, F_UNLCK, lock);
}
int main(int argc, char *argv[]) {
if (argc < 2) {
perror("参数错误。用法:./main 字符串");
return -1;
}
/*各种文件操作
* int fcntl (int __fd, int __cmd, ...)
* __fd 文件句柄
* __cmd 文件操作函数
* ... 文件操作函数的参数
* */
int f = open("./lock.txt", O_RDWR | O_CREAT | O_APPEND, 777);
char *s = argv[1];
if (wlock(f, 1) == -1) {
perror("wlock");
return -1;
}
for (int i = 0; i < strlen(s); i++) {
write(f, &s[i], sizeof(s[i]));
sleep(1);
}
if (unlock(f) == -1) {
perror("unlock");
return -1;
}
close(f);
return 0;
}