文件锁

文件锁

int lockf(int fd, int cmd, off_t len);

int flock(int fd, int operation);

int fcntl(int fd, int cmd, ... /* arg */ );

例程:lockf.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>

#define FILENAME "/tmp/out"   //echo 1 > /tmp/out
#define PROCNUM 20
#define BUFFSIZE 1024

static void add(void)
{
  FILE *fp;
  int fd;
  char buff[BUFFSIZE];

  fp = fopen(FILENAME,"r+");  //读写方式打开文件
  if(fp == NULL)
  {
    perror("fopen():");
    exit(1);
  }
  fd = fileno(fp);        //通过文件流获取文件符

  lockf(fd,F_LOCK,0);      //锁住文件  从当前位置到文件末尾
  fgets(buff,BUFFSIZE,fp);   //读取文件
  fseek(fp,0,SEEK_SET);    //偏移到文件头
  fprintf(fp,"%d\n",atoi(buff)+1);    //将内容加一在写入文件
  sleep(1);          //测试
  fflush(fp);          //刷新数据流
  lockf(fd,F_ULOCK,0);    //解锁文件   从文件当前位置到文件末尾

  fclose(fp);          //关闭文件
}

int main(int argc, char **argv)
{
  int i;
  pid_t pid;

  for(i=0;i<PROCNUM;i++)  //循环创建子线程  
  {
    pid = fork();  
    if(pid <0)
    {
      perror("fork():");
      exit(1);
    }
    if(pid ==0)
    {
      add();  //子线程执行add函数
      exit(0);
    }
   }

  for(i=0;i<PROCNUM;i++)  //等待子线程结束
    wait(NULL);

  exit(0);
}

posted @ 2022-08-01 09:01  *^VV^*  阅读(83)  评论(0编辑  收藏  举报