首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux环境下的open函数分析(一)

今天分享的是linux环境下open函数的解析,其实在前面的文章里面我只是简单的用了一下open函数的用法(因为自己也是刚开始在学习linux,不是很懂,大神勿喷,还请多指出不足之处),当然它还有好多用法和需要注意的地方...说到这里我又想起了man手册,哈哈,因为它可以在linux环境下查看命令和api以及库函数的具体用法,实在是太强悍了。...二、O_APPEND和O_TRUNC的使用: 1、老样子,我们还是先看原注释是怎么注释的: O_APPEND The file is opened in append mode....b、O_APPEND属性去打开文件时,如果这个文件中本来是有内容的,则新写入的内容会在原来的内容后面添加 注:exit _exit _Exit都可以表示退出进程 2、我们来用代码来演示一下O_APPEND...a.txt l love linuxroot@ubuntu-virtual-machine:/mnt/hgfs/day# 注:我在day目录下创建一个a.txt的文本文件,内容是 I love linux

1.5K30

linux系统下文件共享和多次打开同一文件解析

---上一篇文章我们详细的讲解了lseek函数的用法,其实还是那句话,在linux系统下,对于一个陌生的命令、函数、库函数,完全可以用man手册去查看,为了给大家了解一些基本的linux命令使用,这里我推荐一个网站学习...一、多次打开同一文件与O_APPEND: 1、在linux系统下,一个进程中两次打开同一个文件,然后分别读取,这里可以猜想一下它最终的会出现什么情况?...参数去掉就行,它最终的结果如下: 3、O_APPEND的实现原理和其原子操作性说明: 1)O_APPEND为什么能够将分别写改为接续写?...但是O_APPEND标志可以让write和read函数内部多做一件事情,就是移动自己的文件指针的同时也去把别人的文件指针同时移动。...(也就是说即使加了O_APPEND,fd1和fd2还是各自拥有一个独立的文件指针,但是这两个文件指针关联起来了,一个动了会通知另一个跟着动)。O_APPEND对文件指针的影响,对文件的读写是原子的。

1.6K20
您找到你想要的搜索结果了吗?
是的
没有找到

张义飞: 关于文件写入的原子性讨论

在开始之前我们需要补充一下Linux 文件相关的一些基础原理,便于更好的看懂Linux源代码。    ...学过Linux的读者想必都应该知道文件的数据分为两个部分,一个部分就是文件数据本身,另外一个部分则是文件的元数据,也就是inode、权限、扩展属性、mtime、ctime、atime等等,inode对于一个文件来说及其的重要...加锁的确是可以解决问题的,但是在这里未免有点牛刀杀鸡的感觉,好在OS给我们提供了原子写入的方法,第一种就是在打开文件的时候添加O_APPEND标志,通过O_APPEND标志将获取文件的offset和文件写入放在一起用锁进行了保护...而这整个过程都是在加锁的情况下完成的,所以带有O_APPEND标志的情况下,文件的写入是原子的,多线程写文件是不会导致数据错乱的。...本文来源:Linux内核之旅

1.5K40

系统编程-简洁而不简单的文件操作

来源:公众号【编程珠玑】 作者:守望先生 ID:shouwangxiansheng 我们都听过Linux下一切皆文件,实际上无论是普通的文件读写,还是网络IO读写,它们都有着类似的操作过程。...本文通过基本文件IO操作,来了解Linux“一切文件”的读写。当然过程中穿插着很多其他内容。 文件I/O过程 在介绍具体的函数使用之前,我必须说明一下文件I/O的基本过程。...通常0是标准输入,1是标准输出,2是标准错误(参考《如何理解Linux shell中“2>&1”》)。正是有了它们,你的简单程序才可以从控制台读入数据,输出日志,输出错误打印等等。...它须指定以下五个中的一个: O_RDONLY 只读 O_WRONLY 只写 O_RDWR 可读可写 O_EXEC 执行打开 O_SEARCH 搜索打开(针对目录) 而下面的选项是可选的: O_APPEND...在打开的文件后追加内容 如果想在打开的文件后追加内容,那么可以使用O_APPEND标志: int fd = open("test.txt",O_WRONLY | O_CREAT | O_APPEND);

44410

浅墨: 聊聊Linux IO(下)

Linux下Buffered IO默认使用的是Write back机制,即文件操作的写只写到Page Cache就返回,之后Page Cache到磁盘的更新操作是异步进行的。...分别是open(2)调用的O_CREAT和O_APPEND这两个flag属性。前者是文件不存在就创建,后者是每次写文件时把文件游标移动到文件最后追加写(NFS等文件系统不保证这个flag)。...有意思的问题来了,以O_APPEND方式打开的文件write(2)操作是不是原子的?文件游标的移动和调用写操作是原子的,那写操作本身会不会发生改变呢?...坦白讲我也不清楚,有人说Then O_APPEND is atomic and write-in-full for all reasonably-sized> writes to regular files...写在最后 每天抽出不到半个小时,零零散散地写了一周,这是说是入门都有些谬赞了,只算是对Linux下的IO机制稍微深入的介绍了一点。

1.1K20

聊聊Linux IO(下)

Linux下Buffered IO默认使用的是Write back机制,即文件操作的写只写到Page Cache就返回,之后Page Cache到磁盘的更新操作是异步进行的。...分别是open(2)调用的O_CREAT和O_APPEND这两个flag属性。前者是文件不存在就创建,后者是每次写文件时把文件游标移动到文件最后追加写(NFS等文件系统不保证这个flag)。...有意思的问题来了,以O_APPEND方式打开的文件write(2)操作是不是原子的?文件游标的移动和调用写操作是原子的,那写操作本身会不会发生改变呢?...坦白讲我也不清楚,有人说Then O_APPEND is atomic and write-in-full for all reasonably-sized> writes to regular files...写在最后 每天抽出不到半个小时,零零散散地写了一周,这是说是入门都有些谬赞了,只算是对Linux下的IO机制稍微深入的介绍了一点。

3.2K11

logrotate机制和原理

运行机制 logrotate在很多Linux发行版上都是默认安装的。系统会定时运行logrotate,一般是每天一次。系统是这么实现按天执行的。...Linux文件操作机制 介绍一下相关的Linux下的文件操作机制。 Linux文件系统里文件和文件名的关系如下图。 目录也是文件,文件里存着文件名和对应的inode编号。...表里面存着文件的状态信息(O_APPEND/O_CREAT/O_DIRECT...)、当前文件位置和文件的inode信息。系统会为每个进程创建独立的文件描述符和文件表,不同进程是不会共用同一个文件表。...这个问题让我纠结了很久,直到某天灵光一闪,这不是logrotate做的,而是成熟的写日志的方式,都是用O_APPEND的方式写的。...如果程序没有用O_APPEND方式打开日志文件,变会出现copytruncate后日志文件前面会被一堆\0填充的情况。

2.9K31

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

当打开文件并设置了O_APPEND标识,内核会共享文件写入游标,保证内容不会被覆盖。...这个问题涉及到 系统底层 ,这就要看 操作 系统, 与 Windows 不同, Linux 允许一个文件在写入的时候被读取(或者在被读取的时候写入)。...Linux 通过文件描述符表维护了打开的文件描述符信息,而文件描述符表中的每一项都指向一个内核维护的文件表,文件表指向打开的文件的 vnode(Unix) 和 inode。...Linux 提供了 fcntl 系统调用,可以锁定文件。 文件锁是与进程相关的,一个进程中的多个线程/协程对同一个文件进行的锁操作会互相覆盖掉,从而无效。...fcntl 创建的锁是建议性锁,只有写入的进程和读取的进程都遵循建议才有效;对应的有强制性锁,会在每次文件操作时进行判断,但性能较差,因此 Linux/Unix 系统默认采用的是建议性锁。

1.4K10

一图读懂 unix 文件句柄及文件共享过程

对于 vnode,你可以理解成是一组函数指针,例如在 Linux 上,它分别定义了 inode 与文件的操作函数: 1 struct inode_operations { 2 struct...注意:linux 上并没有 vnode 的概念,它使用与文件系统相关的 inode 和文件系统无关的 inode,后者就是我们这里说的 vnode。...这里着重考察一个具体场景,就是两个进程同时打开文件进行追加(O_APPEND)写。...相对的,如果没有指定 O_APPEND 选项,而使用 lseek (fd, 0, SEEK_END) + write (fd, buf, size) 的方式,由于这个操作需要使用两个 api 来完成,无法跨...Linux字符设备驱动file_operations [3]. 驱动程序操作的三个内核数据结构(file_operations、file、inode)

53030

Linux】文件操作文件描述符重定向缓冲区

(3), O_WRONLY | O_CREAT | O_APPEND, 0666); int fd4 = open(FILE_NAME(4), O_WRONLY | O_CREAT | O_APPEND...(3), O_WRONLY | O_CREAT | O_APPEND, 0666); int fd4 = open(FILE_NAME(4), O_WRONLY | O_CREAT | O_APPEND...3、三种重定向的实现 Linux 中主要有三种主要的重定向 – 输入重定向、输出重定向和追加重定向;在 Linux 命令行中它们分别使用 、>> 表示,如下: 输出重定向 输入重定向我们上面已经实现了...下一切皆文件 在刚开始学习 Linux 的时候,我们就说 Linux 下一切皆文件,包括键盘、显示器、磁盘以及网卡这些硬件,现在我们来正式理解这句话: 在 计算机的软硬件体系结构 中我们学到,操作系统是一款管理软件...(Linux 在编写时C++等面向对象的语言还并没有出现,所以这里是用C语言模拟实现C++面向对象) 同时,struct file 是操作系统当中虚拟出来的一层文件对象,在 Linux 中,我们一般将这一层称为

3.7K00

Linux】基础IO——系统文件IO&fd&重定向&理解

(3),O_WRONLY | O_CREAT | O_APPEND,0666); int fd3 =open(FILE_NAME(4),O_WRONLY | O_CREAT | O_APPEND...,0666); 、 int fd4 =open(FILE_NAME(5),O_WRONLY | O_CREAT | O_APPEND,0666); printf("fd: %d\n...stdin—>0,dup2(fd,0);//输入重定向 ---- 六、Linux一切皆文件 Linux一切皆文件: 在冯诺依曼体系中,我们知道硬件有键盘、显示器、磁盘、网卡等外设,在IO过程中,外设任何的数据处理都需要把数据读到内存...每种硬件的访问方法都是不一样的,而Linux一切皆文件是这样体现的:任何一个被打开的文件结构体对象struct file{ //各种文件的属性 }对象,不同的文件对应的读写方法不一样,struct file...站在struct file上层看来,所有的设备和文件,统一都是struct file->,就可以调用具体的设备方法了,所以在用户级看到的就是Linux下一切皆文件!

29620

Linux系统进程编程(二)

原因是父子进程分离后才各自打开的1.txt,这时候这两个进程的PCB已经独立了,文件表也独立了,因此2次读写是完全独立的,当然我们在打开文件操作时,改变open函数里面的参数,使用O_APPEND,还是上面这个操作...,最终它的结果把父子进程各自独立打开的fd的文件指针给关联起来,实现接续写,这里我就不举例了,很简单,只要把上面的参数O_TRUNC改成O_APPEND就可以了,这两个参数的意思,在我前面的文章里面有写过...哈哈哈,听到僵尸两个字是不是有点小害怕,言归正传,在Linux系统中,我们要明白:进程在运行时是需要消耗系统资源(内存、IO),进程终止时理应完全释放这些资源(如果进程消亡后仍然没有释放相应资源则这些资源就丢失了...),所以linux系统设计时规定:每一个进程退出时,操作系统会自动回收这个进程涉及到的所有的资源(譬如malloc申请的内容没有free时,当前进程结束时这个内存会被释放,譬如open打开的文件没有close...同时,linux系统规定:所有的孤儿进程都自动成为一个特殊进程(进程1,也就是init进程)的子进程。

1.6K10
领券