fcntl函数之文件锁 F_SETLKW
F_SETLK与F_SETLKW的区别:
F_SETLK设的锁遇到锁被其他进程占用时,会立刻停止进程。
F_SETLKW上锁是阻塞方式。设置的锁因为其他锁而被阻止设置时,该命令会等待相冲突的锁被释放。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>/**
*
*./myfcntl content typestruct flock {...short l_type;     F_RDLCK,F_WRLCK,F_UNLCKshort l_whence;   How to interpret l_start: SEEK_SET, SEEK_CUR, SEEK_ENDoff_t l_start;    Starting offset for lockoff_t l_len;      Number of bytes to lockpid_t l_pid;      PID of process blocking our lock (set by F_GETLK and F_OFD_GETLK)...};*
*/
int lock_reg(int fd, int cmd, short lock_type, short lock_whence, off_t lock_start, off_t lock_len)
{struct flock lock;lock.l_type = lock_type;lock.l_whence = lock_whence;lock.l_start = lock_start;lock.l_len = lock_len;lock.l_pid = getpid();if (fcntl(fd, cmd, &lock) < 0) {if (errno == EACCES || errno == EAGAIN ) {printf("file lock by other processes.\n");return -1;}printf("lock file fail.\n");return -1;}if (lock_type == F_WRLCK) {printf("lock by %d.\n", getpid());} else if (lock_type == F_UNLCK) {printf("unlock by %d.\n", getpid());}return 0;
}int reg_lock(int fd)
{return lock_reg(fd, F_SETLK, F_WRLCK, 0, SEEK_SET, 0);
}
int reg_unlock(int fd)
{return lock_reg(fd, F_SETLK, F_UNLCK, 0, SEEK_SET, 0);
}int reg_lockw(int fd)
{return lock_reg(fd, F_SETLKW, F_WRLCK, 0, SEEK_SET, 0);
}
int reg_unlockw(int fd)
{return lock_reg(fd, F_SETLKW, F_UNLCK, 0, SEEK_SET, 0);
}/*
*
*.myfcntl AAAAAA
*/
int main(int argv, char *argc[])
{char *buf;int i;int ret;int fd;if (argv < 2) {printf("argc error!\n");return -1;}fd = open("processes.txt", O_CREAT|O_RDWR|O_APPEND, 777);ret = reg_lockw(fd);if (ret !=0 ) {return -1;}sleep(5);buf = argc[1];i = 0;while (i < strlen(buf)) {if (write(fd, buf+i, sizeof(char)) < sizeof(char)) {printf("printf out error!\n");return -1;}printf(" %c:out by pid %d.\n", buf[i], getpid());i++;sleep(1);}ret = reg_unlockw(fd);if (ret !=0 ) {return -1;}close(fd);return 0;
}

同时运行两个进程,第二个被阻塞不退出,直到第一个进程解锁,第二个进程再上锁。
#结果
lock by 18687.
B:out by pid 18687.
B:out by pid 18687.
B:out by pid 18687.
B:out by pid 18687.
B:out by pid 18687.
B:out by pid 18687.
B:out by pid 18687.
unlock by 18687.
lock by 18686.
A:out by pid 18686.
A:out by pid 18686.
A:out by pid 18686.
A:out by pid 18686.
A:out by pid 18686.
A:out by pid 18686.
A:out by pid 18686.
unlock by 18686.
fcntl分为建议锁和强制性锁,默认是建议锁模式,该模式下,一个文件被一个进程锁住后,第二个进程是能直接往这个文件写数据的。建议每次输入数据前都有个上锁操作。

fcntl函数之文件锁 F_SETLKW相关推荐

  1. fcntl函数之文件锁 F_SETLK

    fcntl函数之文件锁 F_SETLK #include <stdio.h> #include <string.h> #include <unistd.h> #in ...

  2. linux系统编程之文件与I/O(六):fcntl 函数与文件锁

    2013-05-14 11:26 8290人阅读 评论(2) 收藏 举报  分类: linux系统编程(19)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.fcntl函数 功能:操纵文 ...

  3. Linux 系统 文件锁 fcntl函数详解

    #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int ...

  4. Linux 文件锁 fcntl 函数详解

    Linux 文件锁 fcntl 函数详解 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); ...

  5. C/C++进程文件锁 之 fcntl函数的用法总结(非阻塞O_NONBLOCK)

    fcntl系统调用可以用来对已打开的文件描述符进行各种控制操作以改变已打开文件的的各种属性 函数原型: #include<unistd.h> #include<fcntl.h> ...

  6. linux fcntl 函数 文件描述符选项控制

    功能描述:根据文件描述词来操作文件的特性. #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); ...

  7. sigaction 函数,sigemptyset()函数,fcntl()函数,isatty()函数

    第一个函数:使用 sigaction函数: signal 函数的使用方法简单,但并不属于POSIX标准,在各类UNIX平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX标准定义的信号处 ...

  8. c 如何加函数锁linux,Linux下C语言中fcntl函数用法说明

    本文最后更新于2017年8月18日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! =Start= 缘由: 学习.提高需要 正文: 参考解答: fcntl – manipulate f ...

  9. c语言中fcntl.h函数库,fcntl函数的使用详解

    (1)fcntl函数说明 前面的这5个基本函数实现了文件的打开.读写等基本操作,这一节将讨论的是,在文 件已经共享的情况下如何操作,也就是当多个用户共同使用.操作一个文件的情况,这时,Linux 通常 ...

最新文章

  1. linux下kafka常用命令
  2. 【设计干货】Facebook设计APP时的14个必考题
  3. [云炬创业管理笔记]第三章测试1
  4. No result defined for action action.LoginAction and result success 问题解决
  5. linux脚本语言求累加和,Linux Shell脚本语言与数学表达式
  6. python爬虫07--代理
  7. mipi 调试经验【转】
  8. C++ 判断进程是否退出 代码封装
  9. 循环链表--约瑟夫问题
  10. 人机交互论文计算机导论,计算机导论第10章人机交互[精].ppt
  11. jQuery(非插件)制作商城放大镜效果
  12. UDK初学教程 01: 基本操作
  13. 2000-2018年各省能源消费和碳排放数据数据、1997-2017年各省地级市县区碳排放数、各国二氧化碳排放量(人均公吨数)1960-2014年、二氧化碳排放量、各省市碳排放权额分配实施方案
  14. SVPWM算法理解(一)——基本原理
  15. 从零开始学架构 04-计算高性能FMEA故障模式分析 【笔记】
  16. java车辆使用管理系统_JAVA车辆管理系统,基于SSM框架的系统
  17. python3 用socket编写ftp
  18. 关于IPv6(超详细讲解)
  19. 密码学史观----Cryptography
  20. python easygui模块_easygui模块放在哪里?

热门文章

  1. Bootstrap概述
  2. 字符数组和字符串的小细节
  3. 在Visual Studio Code中配置GO开发环境
  4. [转] Java, 使用 Reactor 进行反应式编程
  5. 剑指offer二十二之从上往下打印二叉树
  6. javascript数据结构-栈
  7. jQuery触发a标签的点击事件无效
  8. TClientDataSet使用要点
  9. 替换Quartus 自带编辑器 (转COM张)
  10. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇