Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2020-12-11:多个线程同时写同一个日志文件,为什么相互写的内容不会被覆盖?

2020-12-11:多个线程同时写同一个日志文件,为什么相互写的内容不会被覆盖?

原创
作者头像
福大大架构师每日一题
修改于 2020-12-14 03:11:19
修改于 2020-12-14 03:11:19
1.6K0
举报

福哥答案2020-12-11:

答案来自此链接:

这是道面试题,可惜我没什么思路,网上找了些答案。如果有更好的答案,请直接评论。

1.没看代码前,以为会用到缓存队列+组提交。

2.golang的日志源码位于log/log.go中的Output方法。加锁了。

3.系统级别。当打开文件并设置了O_APPEND标识,内核会共享文件写入游标,保证内容不会被覆盖。

这个问题涉及到 系统底层 ,这就要看 操作 系统, 与 Windows 不同, Linux 允许一个文件在写入的时候被读取(或者在被读取的时候写入)。

Linux 通过文件描述符表维护了打开的文件描述符信息,而文件描述符表中的每一项都指向一个内核维护的文件表,文件表指向打开的文件的 vnode(Unix) 和 inode。同时,文件表保存了进程对文件读写的偏移量等信息。

但是 那么我们要如何保证读取与写入的一致性呢? Linux 提供了 fcntl 系统调用,可以锁定文件。

文件锁是与进程相关的,一个进程中的多个线程/协程对同一个文件进行的锁操作会互相覆盖掉,从而无效。

fcntl 创建的锁是建议性锁,只有写入的进程和读取的进程都遵循建议才有效;对应的有强制性锁,会在每次文件操作时进行判断,但性能较差,因此 Linux/Unix 系统默认采用的是建议性锁。


评论

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
linux 文件锁
文件锁是用于解决资源的共享使用的一种机制:当多个用户需要共享一个文件时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。
全栈程序员站长
2022/09/13
3.1K0
linux 文件锁
文件I/O
有一定编程基础的小伙伴应该都接触过文件编程吧,file. 在C语言里面是包一个<file.h>的头
看、未来
2020/08/26
7730
文件描述符与socket连接(下)
1.进程级的文件描述符表 2.系统级的打开文件描述符表 3.文件系统的i-node表
陈不成i
2021/05/25
1.4K0
[操作系统] 基础IO:系统文件I/O
在 Linux 操作系统中,文件 I/O(输入/输出)是程序与文件系统交互的基础。理解文件 I/O 的工作原理对于编写高效、可靠的程序至关重要。本文将深入探讨系统文件 I/O 的机制。
DevKevin
2025/02/17
1130
[操作系统] 基础IO:系统文件I/O
【Linux 编程】:深入解析 fcntl 函数
🔥fcntl 函数是一个在 UNIX 和类 UNIX 系统(如 Linux)上用来操作文件描述符的系统调用
IsLand1314
2025/05/04
840
Linux笔记(5)| 文件IO操作(续)
上一次我们说到了文件的常规操作,打开,读,写,关闭这些,重点在于打开是以什么样的方式来打开,包括文件的权限,内容是否清空,打开不存在的文件等等情形。今天继续说一下文件IO操作。
飞哥
2020/07/10
1.1K0
基础I/O--文件系统
我们要进行文件操作,前提是程序运行起来了,所谓的文件的打开和关闭是CPU执行我们的代码才被打开或者关闭的。 fopen()函数:
南桥
2024/05/06
1080
基础I/O--文件系统
【Linux】理解系统中一个被打开的文件
首先我们在前面的学习中,知道了 文件 = 内容 + 属性,那么我们对文件的操作就是分别对内容和属性操作。
YoungMLet
2024/03/01
3050
【Linux】理解系统中一个被打开的文件
Linux 的进程间通信:文件和文件锁
本文主要探讨了在Linux系统中,文件锁的概念、实现方式、相关命令和应用场景。文件锁主要用于保护文件系统,避免因多个进程并发访问同一文件而导致的竞争条件。通过使用锁命令和工具,可以有效地管理文件锁,确保文件系统的安全性和稳定性。
邹立巍
2017/07/28
7.9K0
File Descriptor问题总结
在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。 文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。 程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号码,因此,在网络通信过程中稍不注意就有可能造成串话。标准文件描述符图如下:
mingjie
2022/05/12
1.1K0
File Descriptor问题总结
Linux文件—文件锁
通过之前的open()/close()/read()/write()/lseek()函数已经可以实现文件的打开、关闭、读写等基本操作,但是这些基本操作是不够的。
全栈程序员站长
2022/09/13
10.1K0
fcntl函数
fcntl是计算机中的一种函数,通过fcntl可以改变已打开的文件性质。fcntl针对描述符提供控制。参数fd是被参数cmd操作的描述符。针对cmd的值,fcntl能够接受第三个参数int arg。
心跳包
2022/05/10
7000
深入了解linux系统—— 基础IO(上)
我们以r方式打开一个文件,我们要像读取这个文件的内容,我们可以使用fgetc、fgets、fscanf进入文件内容的读取操作:
星辰与你
2025/05/19
970
深入了解linux系统—— 基础IO(上)
【Linux系统】从 C 语言文件操作到系统调用的核心原理
本文将从文件的基本概念出发,先回顾 C 语言中文件操作的常用接口,再逐步过渡到 Linux 系统调用,解析文件描述符、文件打开对象、进程与文件的关系等关键概念。通过代码示例和原理分析,带你揭开 Linux 基础 IO 的神秘面纱,理解操作系统如何管理文件、进程如何与文件交互的底层逻辑。
suye
2025/05/29
1170
【Linux系统】从 C 语言文件操作到系统调用的核心原理
Linux:基础IO(一.C语言文件接口与系统调用、默认打开的文件流、详解文件描述符与dup2系统调用)
当在 C 语言中进行文件操作时,fopen() 和 fclose() 是两个非常重要的函数。下面我将详细讲解它们的作用和用法:
是Nero哦
2024/06/13
4440
Linux:基础IO(一.C语言文件接口与系统调用、默认打开的文件流、详解文件描述符与dup2系统调用)
Linux内核中文件的数据结构和原子操作
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/84202404
zy010101
2019/06/11
1.5K0
嵌入式Linux:文件锁
Linux 文件锁是一种用于管理多进程或多线程环境中资源访问的机制,确保只有一个进程或线程在特定时间内对文件进行操作,从而避免数据不一致的情况。
不脱发的程序猿
2025/04/01
2150
嵌入式Linux:文件锁
温故Linux后端编程(一):文件I/O
引用一句经典的话:“UNIX下一切皆文件”。 文件是一种抽象机制,它提供了一种方式用来存储信息以及在后面进行读取。
看、未来
2021/09/18
7230
【Linux】从open到write:系统文件I/O 的奥秘与实战指南
在使用C语言时,我们需要访问文件通常会用到fopen、 fwrite、和fread还有fclose等函数。
Yui_
2024/11/19
1290
【Linux】从open到write:系统文件I/O 的奥秘与实战指南
【Linux】文件系统:文件fd
我们进行文件操作,前提是我们的代码跑起来了,文件的打开和关闭,是cpu在执行我们的代码
用户11029103
2025/02/19
1820
【Linux】文件系统:文件fd
相关推荐
linux 文件锁
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档