[C++] 使用flock构建文件锁,进程读写锁

Linux文件锁flock详解:解决多进程并发文件访问冲突 在Linux/Unix系统中,文件是进程间共享数据的基础媒介。当多个进程或线程并发读写同一文件时,若无协调机制,便会引发竞态条件,导致数据损坏或丢失。文件锁正是解决此类并发访问冲突的核心同步机制之一,它通过在文件级别提供互斥或共享访问控制,确保数据操作的原子性与一致性。其中,flock()作为一种经典的劝告锁,以其清晰的语义和简洁的接口,广泛应用于配置文件保护、日志轮转、脚本防重入等需要整个文件互斥访问的工程实践场景。本文深入解析flock()的劝告锁特性、锁与文件描述符的绑定关系、以及其在Shell脚本中 阅读详情
AI摘要

文章介绍了在多进程环境下如何使用C语言的flock函数实现文件锁,以确保数据一致性,防止竞态条件和数据损坏,特别关注了flock与信号量的区别以及在Linux系统中的应用。,

C语言文件锁 flock

应用场景:

在多进程环境中,多个进程可能会同时访问共享资源,这时就需要考虑如何确保数据的一致性,避免出现竞态条件和数据损坏的情况。例如,在一个业务中多个进程自检需要用到共享内存。而在使用共享内存时,需要考虑多进程同时写入时不发生冲突的问题,基于使用的系统是Linux发行版,解决方案有以下两个:

  1. 使用信号量实现互斥。
  2. 使用C语言的文件锁 flock 函数,利用其独享的性质,来实现进程间的互斥访问。而且,相比较于信号量,使用flock函数构成的互斥锁,在进程以外退出时,进程所持有的文件锁会自动解锁。

flock

PS: flock函数是进程安全的,但不是线程安全的,故使用时可能需要自行加锁。

man手册:

man 2 flock

头文件及声明

#include <sys/file.h>
int flock(int fd, int operation);

参数

参数这建议自己查看man手册的内容。

  • fd: 一个已打开的文件描述符。
  • operation: 文件锁选项, 包括 LOCK_SH(共享锁), LOCK_EX(独占锁), LOCK_UN(解锁),在文件加锁时,若文件已加锁,则会处于程序会处于阻塞,如果希望程序不阻塞,则operation选项需或上LOCK_NB,例如,operation传入 LOCK_EX|LOCK_NB。

返回值:

失败时返回-1

简单的文件锁示例代码

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>

#define LOCKFILE "/tmp/lockfile/.lockfile"

int main()
{
    int fd = 0;
    int ret = 0;

    do {
        fd = open(LOCKFILE, O_RDONLY);
        if (-1 == fd)
        {
            fd = open(LOCKFILE, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
            if (-1 == fd)
            {
                printf ("open() for [%s] failed.\n", LOCKFILE);
                break;
            }
        }

        // file lock
        ret = flock(fd, LOCK_EX);
        if (-1 == ret)
        {    
            printf ("flock() failed.\n");
            break;
        }

        // do something
        // ...

        flock(fd, LOCK_UN);
    }
    while (0);

    if (fd != -1)
    {
        close(fd);
	}
    return 0;
}

进程读写锁代码

代码如下:

测试环境:C++20, 由于使用了共享锁,所以建议c++标准起码>=C++17

Result.hpp

#ifndef RESULT_H
#define RESULT_H 1

// 这个枚举是我习惯用于作为返回值, 此处模拟的是rust的Result
// 加上class是为了用c++的强类型系统
enum class Result 
{
    OK,
    ERROR,
    PARA_ERROR,
    RANGE_ILLEGAL,
    FILE_LOCK_FAIL,
    MKDIR_FAIL
};

#endif

ProcLock.hpp

#ifndef _PROC_LOCK_HPP_
#define _PROC_LOCK_HPP_ 1

#include "Result.hpp"

// 这里为进程锁的接口头文件
namespace ProcLock
{
	// 进程锁的类型,即用于锁哪个共享资源,可以自己添加
	// 例如我想锁一个共享空间是用于存放证书的,那么可以添加 CERT_TYPE
	enum class Type 
	{
		TEST_TYPE,
		CERT_TYPE,
		MAX_NUMS// 不使用, 仅用于计数
	};

	// 进程锁接口函数,包括独占锁和读写锁
	Result Lock(const Type type);
	Result UnLock(const Type type);
	Result SharedLock(const Type type);
    Result SharedUnLock(const Type type);
	
	// 用于进程锁的RAII类,实现构造函数加锁,析构函数解锁,防止遗忘
	class RAII_Lock
	{
	private:
		ProcLock::Type m_type;
	public:
		explicit RAII_Lock(const ProcLock::Type type)
			: m_type(type)
		{
			Lock(m_type);
		}
		~RAII_Lock()
		{
			UnLock(m_type);
		}
	};

	class RAII_ShardLock
	{
	private:
		ProcLock::Type m_type;
	public:
		explicit RAII_ShardLock(const ProcLock::Type type)
			: m_type(type)
		{
			SharedLock(m_type);
		}
		~RAII_ShardLock()
		{
			SharedUnLock(m_type);
		}
	};
}
#endif

ProcLock.cpp

#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/types.h>

#include <cstdio>
#include <cstring>
#include <cstdlib>

#include <mutex>
#include <filesystem>
#include <shared_mutex>

#include "ProcLock.hpp"

// 文件锁的文件模式,用于创建一个新文件
#define LOCK_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
// 文件锁文件的存放路径
constexpr char PROC_LOCK_FILE_PATH[] = "/tmp/.lock/";
// 总共有多少个文件锁类型
constexpr unsigned PROC_LOCK_MAX_NUM = static_cast<unsigned>(ProcLock::Type::MAX_NUMS);

// 进程锁类,使用类是为了其数据成员为私有,其实使用static定义全局变量也行
class CProcLock
{
private:
	// 进程锁初始化标志
	bool m_is_init;
	// flock对应的fd数组
	int m_fds[PROC_LOCK_MAX_NUM];
	// 线程读写锁,为了实现进程锁线程安全
    std::shared_mutex m_rw_mtxs[PROC_LOCK_MAX_NUM];
    // 互斥锁,为了锁住进程读锁的数量
    std::mutex m_shard_nums_mtxs[PROC_LOCK_MAX_NUM];
    // 统计当前有多少个线程持有进程读锁,进程读锁计数器
	unsigned m_shared_lock_nums[PROC_LOCK_MAX_NUM];
public:
	CProcLock() noexcept
		: m_is_init(false) // 把进程锁初始状态设定为false 
	{
		// 使用c++17引入的文件系统
		
		// ec是为了避免抛出异常,这个在boost库中很常见,相当于C语言的errno
		std::error_code ec; 
		
		char file_name[256] = {0};
		// c++17文件系统引入的类
		// 参考链接: https://zh.cppreference.com/w/cpp/filesystem/directory_entry
		std::filesystem::directory_entry dir(PROC_LOCK_FILE_PATH); 
		do 
		{
			// 判断存放进程锁文件的目录是否存在以及是否为目录
			if (dir.exists(ec) != true || dir.is_directory(ec) != true)
			{
				// 若该路径代表的不是目录,则删除该文件
				if (dir.is_directory(ec) != true)
				{
					// 参考链接: https://zh.cppreference.com/w/cpp/filesystem/remove
					std::filesystem::remove(PROC_LOCK_FILE_PATH, ec);
				}
				// 创造该目录
				// 参考链接: https://zh.cppreference.com/w/cpp/filesystem/create_directory
				if (std::filesystem::create_directory(PROC_LOCK_FILE_PATH, ec) != true)
				{
					std::printf("in CProcLock:: create_directory() failed.\n");
					break;
				}
			}
			for (unsigned i = 0U; i < PROC_LOCK_MAX_NUM; i++)
			{
				::memset(file_name, 0, sizeof(file_name));
				::snprintf(file_name, sizeof(file_name), "%s%04u.lockfile", PROC_LOCK_FILE_PATH, i);
				// 初始化flock所需要的文件描述符数组
				m_fds[i] = ::open(file_name, O_RDWR|O_CREAT, LOCK_MODE);
                // 将读锁计数器的数目初始化为0
                m_shared_lock_nums[i] = 0U; 
                // 文件描述符打开失败
				if (-1 == m_fds[i]) // open fail, break
				{
					break;
				}
				// 文件描述符数组初始化完毕,将进程锁初始化状态设为true
				if (PROC_LOCK_MAX_NUM-1 == i) // end, set init flag true
				{
					m_is_init = true; 
				}
			}
		}
		while (0);
	}
	~CProcLock()
	{
		// 在析构函数中,对文件锁进行尝试解锁,并关闭已打开的文件描述符,以及设初始化状态为false
		for (unsigned i = 0U; i < PROC_LOCK_MAX_NUM; i++)
		{
			::flock(m_fds[i], LOCK_UN);
			if (m_fds[i] >= 0)
			{
				::close(m_fds[i]);
				m_fds[i] = -1;
			}
		}
		m_is_init = false;
	}

	Result lock(const ProcLock::Type type) // 写锁
	{
		if (ProcLock::Type::MAX_NUMS == type) // 类型错误
		{
			return Result::PARA_ERROR;
		}
		if (m_is_init != true) // 进程锁为初始化
		{
			return Result::FILE_LCOK_UN_INIT;
		}
		// 将枚举转换为对应的数组下标,以获得对应的文件描述符和mutex
		const unsigned type_num = static_cast<unsigned>(type); 
		// 先保证线程安全,对应的线程读写锁加写锁
        m_rw_mtxs[type_num].lock(); 
        // 对文件进行加锁
		const int ret = ::flock(m_fds[type_num], LOCK_EX);
	
		return (ret != 0 ? Result::FILE_LOCK_FAIL : Result::OK);
	}
	Result shared_lock(const ProcLock::Type type)
	{
		if (ProcLock::Type::MAX_NUMS == type)
		{
			return Result::PARA_ERROR;
		}
		if (m_is_init != true)
		{
			return Result::FILE_LCOK_UN_INIT;
		}
		int ret = 0;
		const unsigned type_num = static_cast<unsigned>(type);
		// 先保证线程安全,对应的线程读写锁加读锁
        m_rw_mtxs[type_num].lock_shared();
        // 对应的文件锁的互斥锁加锁,目的是保证持有读锁的计数器线程安全
        m_shard_nums_mtxs[type_num].lock();   
        // 当进程读锁计数器数目为0时,对文件加读锁   
        if (0 == m_shared_lock_nums[type_num])
		{
			ret = ::flock(m_fds[type_num], LOCK_SH);
		}
		// 进程读锁计数器数目++
		m_shared_lock_nums[type_num]++;
		// 解开互斥锁
        m_shard_nums_mtxs[type_num].unlock();      
		return (ret != 0 ? Result::FILE_LOCK_FAIL : Result::OK);
	}
	Result unlock(const ProcLock::Type type)
	{
		if (ProcLock::Type::MAX_NUMS == type)
		{
			return Result::PARA_ERROR;
		}
		if (m_is_init != true)
		{
			return Result::FILE_LCOK_UN_INIT;
		}
		const unsigned type_num = static_cast<unsigned>(type);
		// 解开文件锁
        const int ret = ::flock(m_fds[type_num], LOCK_UN);
        // 解开文件锁后再解开对应的线程读写锁的写锁
        m_rw_mtxs[type_num].unlock();
		return (ret != 0 ? Result::FILE_LOCK_FAIL : Result::OK);
	}
    Result shared_unlock(const ProcLock::Type type)
	{
		if (ProcLock::Type::MAX_NUMS == type)
		{
			return Result::PARA_ERROR;
		}
		if (m_is_init != true)
		{
			return Result::FILE_LCOK_UN_INIT;
		}
		int ret = 0;
		const unsigned type_num = static_cast<unsigned>(type);
		// 对应的文件锁的互斥锁加锁,目的是保证持有读锁的计数器线程安全
        m_shard_nums_mtxs[type_num].lock();   
        // 进程读锁计数器--   
		if (m_shared_lock_nums[type_num] > 0)
		{
			m_shared_lock_nums[type_num]--;
		}
		// 当进程读锁计数器为0时,对文件进行解锁
		if (0 == m_shared_lock_nums[type_num])
		{
			ret = ::flock(m_fds[type_num], LOCK_UN);
		}
		// 解开互斥锁
        m_shard_nums_mtxs[type_num].unlock();
        // 解开文件锁后再解开对应的线程读写锁的读锁      
        m_rw_mtxs[type_num].unlock_shared();
		return (ret != 0 ? Result::FILE_LOCK_FAIL : Result::OK);
	}
};

// 这里是为了实现为单例模式的
// 这也是我为什么把类声明定义在源文件中而非头文件中
static CProcLock g_PROC_LOCK;

Result ProcLock::Lock(const ProcLock::Type type)
{
	return g_PROC_LOCK.lock(type);
}

Result ProcLock::UnLock(const ProcLock::Type type)
{
	return g_PROC_LOCK.unlock(type);
}

Result ProcLock::SharedLock(const ProcLock::Type type)
{
	return g_PROC_LOCK.shared_lock(type);
}

Result ProcLock::SharedUnLock(const ProcLock::Type type)
{
	return g_PROC_LOCK.shared_unlock(type);
}
C++文件系统并发控制:从互斥锁到无锁队列的实战指南 在多线程编程中,并发控制是确保数据一致性和系统稳定性的核心技术。其核心原理在于通过同步原语协调多个执行流对共享资源的访问,避免竞态条件导致的数据错乱。从基础的互斥锁到更精细的读写锁、条件变量,再到操作系统级别的文件锁,不同的同步机制为开发者提供了应对各类并发场景的工具箱。这些技术的核心价值在于,它们能够显著提升高并发I/O场景下的程序健壮性和性能,例如在数据库、网络服务和游戏引擎中管理文件访问。本文将聚焦于C++文件系统操作,深入探讨如何设计高效的锁机制与同步策略,并结合互斥锁和条件变量等热词,解析其在构建 阅读详情

相关推荐

flock 函数

flock 函数在许多编程语言中都用来管理文件锁定,以确保多个进程/线程不会同时访问同一个文件。

数字人生 780

C/C++ flock函数(Linux)文件锁

头文件:<sys/file.h> 定义:int flock(int fd, int operation); 函数说明:flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。 参数说明: - LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。 - LOCK_E...

LU_ZHAO的博客 4208

C语言实现文件锁(附完整源码)

C语言实现文件锁(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 887

C++跨源文件锁(线程间共享锁,不同源文件共享同一锁实例)(std::mutex)

将锁的定义放在一个源文件中,然后在头文件中声明为extern。这样,多个源文件中包含该头文件时,都会引用同一个锁实例。这样,不同源文件都可以使用同一个锁实例,以保证它们之间的互斥。

Dontla的博客 1258

Linux C++多进程同步锁内存共享【源代码】

无亲缘关系多进程,使用互斥同步锁实现内存共享。

VS2022如何兼容老项目?.NET Framework 4.0/4.5安装避坑指南

本文提供了在Visual Studio 2022中兼容和维护.NET Framework 4.0/4.5等老旧项目的完整解决方案。针对VS2022无法直接识别旧框架的核心问题,文章详细剖析了原因,并重点推荐通过官方NuGet包安全获取引用程序集的方法,给出了从下载、解压到部署至标准目录的详细步骤。同时,文章还深入探讨了项目文件格式过旧、NuGet包还原失败等进阶问题的排查与解决策略,旨在帮助开发者高效、稳定地在现代开发环境中维护历史代码库。

weixin_27734811的博客 514

C语言库函数---flock

需要的头文件: sys/file.h 作用: 函数会依照operation所指定的方式对参数fd所指文件做各种锁定和解锁的动作,此函数只能锁定整个文件,不能锁定文件的某一个部分 函数原型: int flock(int fd,int operation); 参数解释: fd:open的返回值,为int型 operation: LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。 LO...

qq_23929673的博客 1959

SecureCRT串口连接保姆级教程:从驱动安装到波特率设置(附常见问题解决)

本文提供SecureCRT串口连接的保姆级教程,涵盖从USB转串口驱动安装、端口识别到波特率等核心参数设置的完整流程。针对连接失败、乱码、键盘输入无响应等高频问题,给出了深度排查与解决方案,帮助网络与嵌入式开发新手快速掌握串口调试技能。

weixin_29281941的博客 433

被遗忘的桃源——flock 文件锁

缘起 文件锁 flock 共享锁与排他锁 阻塞与非阻塞 flock 实现细节 调用dup forkexecve 时的文件锁 使用 dup 复制文件描述符 通过 fork 产生子进程 子进程重复加锁 execve 函数族中的文件锁 文件锁的解除 用 LOCK_UN 解锁 关闭文件时自动解解锁 常规使用示例 flock 命令 结语缘起在后台开发中,随着多线程应用日益增多,人们对多进程的关注也在逐渐减弱

奔跑的企鹅 5871

通讯接口应用笔记3:使用W5500实现Modbus TCP服务器

  前面我们设计实现了W5500的驱动程序,也讲解了驱动的使用方式。在最近一次的项目应用中,正好有一个使用W5500实现TCP通讯的需求,所以我们就使用该驱动程序轻松实现。这一篇中我们就来说一说基于我们W5500通讯驱动程序实现TCP通讯的过程。 1、应用需求   在本次应用中,要求实现一个基于W5500的Modbus TCP服务器。这个需求的描述虽然只有一句话,但是这个需求的内容可不简单。我们首先来分析一下这个需求的具体内容。   为了实现基于W5500的Modbus TCP服务器,我们必先须基于W550

木南创智 5499

【医学影像】超声(UltraSound)影像的增强与目标检测

文章目录1 综述1.1 超声发展简史1.2 超声类型2 超声影像的去噪与增强2.1 各向异性扩散去噪模型2.2 色彩恢复的视网膜增强算法SSR和MSR2.3 MSRCR增强算法(基于MSR算法改进版)2.4 参考文献3 超声影像的目标识别3.1 基于跨模态数据迁移进行DL训练3.2 参考文献 1 综述 因工作需要,最近调研了超声(UltraSound)影像的相关知识,包含超声类型、超声影像的去噪和增强,目标检测等,并对相关资料文献进行梳理整合。 本人另外一篇博文主要讲了UltraSound 影像与CT/MR

muyijames的博客 1万+

同步方式:文件锁flock()/fcntl()、互斥锁与条件变量、信号量、读写锁

文件锁前言一、flock()给文件加锁二、fcntl()给记录(文件)加锁1、write_lock.c 互斥写2、read_lock.c 共享读 前言 1、文件锁包含劝告式锁和强制式锁。 劝告式锁:要求每个使用上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁,它们依靠程序员遵守这个规定。 强制式锁:是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。 .

xiupong的博客 3583

python利用IQR方法与3σ方法进行异常值处理(含代码)

python利用IQR方法进行异常值处理

weixin_46713695的博客 2031

文件锁详解:劝告锁与强制锁、共享锁与独占锁、flock与fcntl

文件锁是进程间同步的重要机制。为什么多个进程写同一文件会数据错乱?劝告锁和强制锁有什么区别?共享锁和独占锁如何工作?flock和fcntl锁有什么不同?理解文件锁的类型、锁的粒度、死锁检测、锁的继承规则,才能掌握文件并发访问控制的本质。从"多进程写日志错乱"问题出发,剖析文件锁机制的核心原理。通过劝告锁的协作特性、强制锁的内核强制、共享锁与独占锁的读写分离、flock的整文件锁定、fcntl的字节范围锁定,揭秘文件并发控制的完整逻辑。配合详细对比分析,给出文件锁选择的透彻理解。南北绿豆文件锁。

比较是偷走幸福的小偷 2697

44、单级静态电流消耗最小化方法及功率优化比较器设计

本文探讨了单级静态电流消耗最小化方法及功率优化的多米诺逻辑比较器设计。通过分析类“AB”输入CMOS差分对电路,提出利用补偿电流源实现高低电流模式切换,提升运算放大器性能;结合VTCMOS与时钟门控技术,在90nm CMOS中设计低功耗比较器,并采用多米诺逻辑提高速度与能效。通过对比传统与改进型多米诺逻辑的静态功耗、动态功耗、延迟和PDP,验证了所提方案在高性能与低功耗方面的优势,适用于便携式设备等对能效要求严苛的应用场景。

pp12345的博客 121

2022年全国职业院校技能大赛 高职组大数据技术与应用卷⑦——解析答案

大数据时代,电商经营模式发生很大改变。在传统运营模式中,缺乏数据积累,人们在做出一些决策行为过程中,更多是凭借个人经验和直觉,发展路径比较自我封闭。而大数据时代,为人们提供一种全新的思路,通过大量的数据分析得出的结果将更加现实和准确。商家可以对客户的消费行为信息数据进行收集和整理,比如消费者购买产品的花费、选择产品的渠道、偏好产品的类型、产品回购周期、购买产品的目的、消费者家庭背景、工作和生活环境、个人消费观和价值观等。通过数据追踪,知道顾客从哪儿来,是看了某网站投放的广告还是通过朋友推荐链接,是新访客还是

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 471

【Linux线程同步专题】五、进程间同步

《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具、Linux文件IO、进程管理、进程通信、多线程等,请关注专栏免费学习。

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 1053

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表示的是阳性样本的比例

data+scenario+science+insight 1225

C++实现跨进程文件读写锁:原理、设计与工程实践

在多进程并发编程中,共享资源的访问控制是核心挑战。读写锁作为一种经典的并发控制机制,允许多个读操作并行执行,而写操作则独占资源,从而在保证数据一致性的同时,显著提升读密集型场景的性能。其基本原理是通过维护读者计数和写者标志来实现“多读单写”的语义。在跨进程场景下,由于进程间内存空间隔离,标准库的读写锁无法直接使用,需要借助进程间通信机制共享锁状态。基于文件系统的实现方案因其良好的可移植性和简洁性,成为跨进程同步的实用选择。通过原子文件操作和目录结构模拟锁状态,结合RAII设计模式,可以构建出健壮且易用的跨进

weixin_30977485的博客 238

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux编程中的文件锁之flock

转载请说明出处:http://blog.youkuaiyun.com/cywosp/article/details/30083015 1. 场景概述     在多线程开发中,互斥锁可以用于对临界资源的保护,防止数据的不一致,这是最为普遍的使用方法。那在多进程中如何处理文件之间的同步呢?我们看看下面的图: 图中所示的是两个进程在无同步的情况下同时更新同一个文件的过程,其主要的操作是: 1. 从文

andylauren的专栏 581

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

flock 系统函数详解

flock系统函数详解

zhaominyong的专栏 461

多线程fstream带文件锁写数据

#include <fstream> #include <iostream> #include <stdlib.h> #include <vector> #include <string> #include <stdio.h> #include <unistd.h> #include &...

aobu0171的博客 1001

文件的进程线程锁

Flock 函数 互斥锁 线程可用, 多进程可用,但fork进程不行 Fcntl 函数 多进程可用 fork进程可用 但线程不行   Fcntl函数的记录锁所用来设置对文件进行加密,所以无论是fork还是多个程序对同一个文件均可以起到加锁的作用。但对线程则没有作用。简单使用可以,涉及到多进程特别是fork的话就需要注意了。因为fork继承此文件描述符,在fork中释放锁,那么也就是主进程释放

misslio的专栏 730

文件IO操作之文件锁fcntl()函数

linux是多用户的操作系统,在实际的应用中不可避免的会出现多个用户(或是多个进程)共同使用、操作一个文件的情况,这时,linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。文件锁 — 建议性锁:要求每个上锁文件的进程都要检查是否有锁存在,并尊重已有的锁。 —-强制性锁:由内核执行的锁,当一个文件被上锁进行写入的时候,内核将阻止其他任何文件对其 进行读

wofeile880_jian的博客 780

APUE习题14.1

#include<iostream> #include<apue.h> #include<my_error.h> #include<unistd.h> #include<fcntl.h> #include<signal.h> #include<errno.h> #include<signal.h> using namespace std; extern int errno; struct flock fcn

weixin_42614575的博客 183

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

(转自:https://blog.youkuaiyun.com/jnu_simba/article/details/8927115) 一、fcntl函数 功能:操纵文件描述符,改变已打开的文件的属性 int fcntl(int fd, int cmd, ... /* arg */ ); cmd的取值可以如下: 复制文件描述符 F_DUPFD (long) 设置/获取文件描述符标志 F_GE...

Uaena的博客 376
上一篇: [C++]日志系统
下一篇: [C++]利用可变模板将不定入参连接为字符串返回
scau_coderlin
博客等级 码龄3年 10粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值