您的位置:首页 > 其它

flock

2015-12-10 17:09 204 查看
flock返回正常0,不正常非0.

  参数 operation有下列四种情况:

  LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。

  LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。

  LOCK_UN 解除文件锁定状态。

  LOCK_NB 不阻塞,文件已经被所了的话返回非0。通常与LOCK_SH或LOCK_EX 做OR(|)组合。

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/file.h>

#include <sys/wait.h>

#include <errno.h>

#define LOCK_FILE_PATH "./flock.txt"

int main()

{

int pid = fork();

if(pid > 0)

{

usleep(200);//等一哈,等写文件

while(access(LOCK_FILE_PATH, F_OK))

{

printf("surpas:%s,%d\n", __FILE__, __LINE__);

usleep(200);

}

FILE *readf = fopen(LOCK_FILE_PATH, "r");

if(!readf)

{

printf("surpas:%s,%d\n", __FILE__, __LINE__);

exit(-1);

}

int rfd = fileno(readf);

char getbuf[100];

if(flock(rfd, LOCK_EX | LOCK_NB) == 0)//锁文件,非阻塞模式,如果文件被锁,返回非0到else

{//正常

printf("surpas:%s,%d\n", __FILE__, __LINE__);

fscanf(readf,"%10s", getbuf);

printf("surpas:%s,%d,%s\n", __FILE__, __LINE__, getbuf);

if(flock(rfd,LOCK_UN) == 0)

{//正常

printf("surpas:%s,%d\n", __FILE__, __LINE__);

}

}

else

{

printf("surpas:%s,%d\n", __FILE__, __LINE__);

}

fclose(readf);

wait(NULL);

printf("surpas:%s,%d\n", __FILE__, __LINE__);

}

else if(pid == 0)

{

FILE *writef = fopen(LOCK_FILE_PATH, "w");

if(!writef)

{

printf("surpas:%s,%d\n", __FILE__, __LINE__);

exit(-1);

}

int wfd = fileno(writef);

if(flock(wfd, LOCK_EX) == 0)

{

printf("surpas:%s,%d\n", __FILE__, __LINE__);

fprintf(writef,"abcdefghijk123456");

sleep(2);//写完等一哈,看读那边是否阻塞

if(flock(wfd,LOCK_UN) == 0)

{

printf("surpas:%s,%d\n", __FILE__, __LINE__);

fclose(writef);

exit(0);

}

}

else

{

printf("surpas:%s,%d\n", __FILE__, __LINE__);

fclose(writef);

exit(-1);

}

printf("surpas:%s,%d\n", __FILE__, __LINE__);

fclose(writef);

exit(-1);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: