#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <string.h> #define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) #define SEQFILE "seqno" #define MAXLINE 4096 void my_lock(int fd); void my_unlock(int fd); int main(int argc, char** argv) { int fd; long i, seqno; pid_t pid; ssize_t n; char line[MAXLINE]; pid = getpid(); fd = open(SEQFILE, O_RDWR, FILE_MODE); for(i = 0; i < 20; i++) { my_lock(fd); lseek(fd, 0L, SEEK_SET); n = read(fd, line, MAXLINE); line[n] = '\0'; n = sscanf(line, "%ld\n", &seqno); printf("%s: pid = %ld, seq# = %ld\n", argv[0], (long)pid, seqno); seqno++; snprintf(line, sizeof(line), "%ld\n", seqno); lseek(fd, 0L, SEEK_SET); write(fd, line, strlen(line)); my_unlock(fd); } exit(0); }
加锁和解锁的两种实现:
#include <stdio.h> #include <unistd.h> void my_lock(int fd) { return; } void my_unlock(int fd) { return; }
#include <fcntl.h> #include <unistd.h> #include <stdio.h> void my_lock(int fd) { struct flock lock; lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; fcntl(fd, F_SETLKW, &lock); } void my_unlock(int fd) { struct flock lock; lock.l_type = F_UNLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; fcntl(fd, F_SETLK, &lock); }