Linux学习笔记(共享内存 +⽂件锁 + 信号量 +Shell脚本编程 +云服务器⼊⻔)之文件锁

⽂件锁 

前⾔ 

前⾯我们已经学习了三种IPC的⽅式,但是其中如果我们利⽤共享⽂件或共享内存的⽅式来进⾏通 

信,会遇到多个进程同时访问共享资源⽽导致冲突的问题(竞态条件)。下⾯我们将介绍两种最常⽤ 

的避免冲突的⽅法:本节所讲的⽂件锁和下⼀节所讲的信号量。 

的的fcntl 

UNIX提供了3种臆法锁住打开的崛件:羊群,提供lockf和的fcntl三者中最灵活和移植性最好的 

是的fcntl。 

    作⽤:锁住⽂件,避免数据混乱。 

    头⽂件:#include <fcntl.h> 

    函数原型:int fcntl(int fd,int cmd,... / * struct flock * flockptr * /); 

    参数说明: 

        FD:愧件描述符 

        CMD:指定要进搓的锁操作,包括F_GETLK,F_SETLK或F_SETLKW 

        fl ockptr:指向fl ock结构的指针 

    返回值: 

        成功:根据CMD返回特定值 

        失败:返回-1 

    FL玉珠的结构 

-----------------------页面5 -----------------------

        struct flock { 

        短L_TYPE; //锁定类型:F_RDLCK,F_WRLCK或F_UNLCK 

        简短l_whence; //如何解释l_start:SEEK_SET,SEEK_CUR或 

        SEEK_END 

        off_t l_start; //锁定的起始偏移量 

        off_t l_len; //要锁定的字节数 

        pid_t l_pid; //进程阻塞OU锁定的PID(F_GETLK) 

        }; 

示例代码 

lock fi lewrite.c写蹴件锁 

   #include <unistd.h> 

   #include <fcntl.h> 

   #include <stdlib.h> 

   #include <stdio.h> 

   #include <string.h> 

   主要(){ 

        int fd; 

        if((fd = open(“forlock”,O_WRONLY))== - 1){ 

            PERROR(“无法打开”); 

            出口(1); 

        } 

        struct flock lockinfo; 

        lockinfo.l_type = F_WRLCK; 

        lockinfo.l_len = 0; 

        lockinfo.l_pid = GETPID(); 

        lockinfo.l_whence = SEEK_SET; 

        lockinfo.l_start = 0; 

        if(fcntl(fd,F_SETLKW,&lockinfo)== - 1){ 

        PERROR(“无法锁定”); 

        出口(1); 

        } 

        int i; 

        for(i = 0; 我<5; 我++){ 

            写(fd,“Hello world \ n”,strlen(“Hello world \ n”)); 

        } 

        的printf(“写\ n”); 

        睡眠(10); 

        lockinfo.l_type = F_UNLCK; 

        if(fcntl(fd,F_SETLKW,&lockinfo)== - 1){ 

            PERROR(“无法锁定”); 

            出口(1); 

        } 

        关闭(FD); 

   } 

----------------------- Page 6 -----------------------

lock fi leread.c读愧件锁 

    #include <unistd.h> 

    #include <fcntl.h> 

    #include <stdlib.h> 

    #include <stdio.h> 

    主要(){ 

         int fd; 

         if((fd = open(“forlock”,O_RDONLY))== - 1){ 

         PERROR(“无法打开”); 

         出口(1); 

         } 

         struct flock lockinfo; 

         lockinfo.l_type = F_RDLCK; 

         lockinfo.l_len = 0; 

         lockinfo.l_pid = GETPID(); 

         lockinfo.l_whence = SEEK_SET; 

         lockinfo.l_start = 0; 

         if(fcntl(fd,F_SETLKW,&lockinfo)== - 1){ 

              PERROR(“无法锁定”); 

              出口(1); 

         } 

         char buf [512]; 

         int n; 

         while((n = read(fd,buf,512))> 0){ 

              printf(“%。* s”,n,buf); 

         } 

         睡眠(10); 

         lockinfo.l_type = F_UNLCK; 

         if(fcntl(fd,F_SETLKW,&lockinfo)== - 1){ 

              PERROR(“无法锁定”); 

              出口(1); 

         } 

         关闭(FD); 

    } 

本篇非作者所著:来自一位大神!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值