美文网首页
linux的标准IO的buffer

linux的标准IO的buffer

作者: 拿着滋水枪的消防员 | 来源:发表于2022-04-20 14:41 被阅读0次

今儿出了这么一事,由于做daemon进程时候stdin stout sterr没有重定向到/dev/null,当终端关闭后,句柄找不到对应的终端,导致程序崩溃了。
分析原因到原因后,用python测试了一下,发现如果用print每次输出的字符串小于1024,程序在标准IO无法正常得情况下不影响程序,但是一单超过1024或者一单有‘\n’ 就会触发 linux 的io error 5。
再次使用sys.stdout.write('xxx')函数进行测试,发现并不是每次输出小于1024就可以过,而是无论每次输出多少字符,累计一旦达到1024个字符 准确的说是最后一次write()的字符加上之前write综合大于1024就会触发io error 5。
根据以上的现象大胆猜测可能是存在一个默认1024的buff,查资料得知,IO有两种一种是unix io 就是咱们平时用的open write read close等方法,是unbuffer的IO,另外一种是与stream结合的标准IO也叫做buffer io,buffer分三种,分别是line buff、full buff、no buff , stderr默认是no buff,stdin跟stdout默认是line buff,这就解释了之前实验的现象 ,但是linux内核fd结构体里并没有buffer这么个属性,但是linux内核stream结构体标准IO的write,read等对stream的操作都是有buffer设定的,改变标准IO的buff size也可以通过linux内核自带的函数setvbuf()或者setbuf()来实现对stream结构体的buffer大小的改变。
回到python里 ,python打开标准IO用fdopen,以下是测试的python代码,用了这个代码,buffer从1024变成了512.
import Daemon
import time
import os
import sys
Daemon.Start() #变成守护进程
time.sleep(10)
fd=open("out.txt",'a')
fail=False
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 512) #设定为512B的buffer
for i in xrange(2048):
if not fail:
try:
sys.stdout.write('a'i)
out=str('a'
i)
except Exception,err:
out=str(err)
fail=True
fd.write(out)
else:
break

相关文章

  • linux的标准IO的buffer

    今儿出了这么一事,由于做daemon进程时候stdin stout sterr没有重定向到/dev/null,当终...

  • Linux 文件IO 和 标准IO

    [TOC] Linux 文件IO 和 标准IO Linux 文件IO Linux中做文件IO最常用到的5个函数是:...

  • 大数据硬件选择

    1.关闭BIOS省电模式 2.RAID 卡选择带Raid cache. Linux IO Cache/Buffer...

  • 11.标准IO库

    标准IO和文件IO有什么区别 看起来使用时都是函数,但是:标准IO是C库函数,而文件IO是linux系统的API ...

  • oracle中的buffer cache 详解

    1、block、buffer的概念 复习段区块 2、buffer cache的意义 减少IO 物理IO:磁盘读 逻...

  • IO buffer

    今天要介绍的数字后端概念是IO Buffer。主要是指放置在block level的port附近的buffer[h...

  • linux 标准io笔记

    三种缓冲 1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的.2.行缓冲:在...

  • 软件架构设计-操作系统

    操作系统 直接IO与缓冲IO 缓冲io又称作标准I/O,大多数文件系统的默认IO操作都是缓冲IO。在linux的缓...

  • JAVA之道丨文件复制的四种方法

    import java.io.BufferedInputStream; import java.io.Buffer...

  • linux的零拷贝技术

    在介绍零拷贝技术之前,不得不提的是linux中标准的IO操作存在的问题。linux中的IO操作(主要是read和w...

网友评论

      本文标题:linux的标准IO的buffer

      本文链接:https://www.haomeiwen.com/subject/nngjsrtx.html