#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);
}