现在的位置: 首页 > 综合 > 正文

多进程记录加锁

2013年07月12日 ⁄ 综合 ⁄ 共 1063字 ⁄ 字号 评论关闭
#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);
}

抱歉!评论已关闭.