多进程记录加锁

来源:互联网 发布:数据分析相关分布 编辑:程序博客网 时间:2024/05/22 18:22
#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 4096void 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);}