zoukankan      html  css  js  c++  java
  • linux编程fcntl获取和设置文件锁

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <string.h>
    
    
    #define ERR_EXIT( m ) 
            do 
            { 
                    perror( m ); 
                    exit( EXIT_FAILURE ); 
            }while( 0 )
    
    
    int main( int argc, char* argv[] ) {
    
            if( argc != 2 ) {
                    fprintf( stderr, "usage:%s filename", argv[0] );
                    exit( EXIT_FAILURE );
            }
    
            int fd;
            fd = open( argv[1], O_RDWR | O_TRUNC | O_CREAT, 0666 );
            if( -1 == fd ) {
                    ERR_EXIT( "文件打开失败" );
            }
    
            struct flock lock;
            memset( &lock, 0, sizeof( lock ) );
    
            lock.l_type = F_WRLCK; //写锁
            lock.l_whence = SEEK_SET;
            lock.l_start = 0;
            lock.l_len = 0;
    
    
            //加文件写锁, 另一个进程操作文件 直接报错
            //int ret = fcntl( fd, F_SETLK, &lock );
            //加文件写锁, 另一个进程操作文件 会等待这个进程释放锁
            int ret = fcntl( fd, F_SETLKW, &lock );
            if( -1 == ret ) {
                    ERR_EXIT( "加锁失败" );
            }else {
                    printf( "加锁成功
    " );
                    printf( "输入任意字符解锁
    " );
                    getchar();
                    lock.l_type = F_UNLCK;
                    if ( fcntl( fd, F_SETLK, &lock ) == -1 ) {
                            printf( "释放锁失败
    " );
                    }else{
                            printf( "释放锁成功
    " );
                    }
            }
    
            return 0;
    }
    

      

  • 相关阅读:
    生成器 三元表达式 列表生成式 匿名函数 内置函数
    迭代器
    叠加装饰器和补充部分
    函数的名称空间和作用域
    函数基础
    闭包函数和装饰器
    文件的处理
    第十章 程序的循环结构
    第九章 身体质量指数BMI的python实现
    第八章 程序的分支结构
  • 原文地址:https://www.cnblogs.com/ghostwu/p/10984861.html
Copyright © 2011-2022 走看看