read

管道输出到read中遇到的问题

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-05 02:07:48
1. 管道输出到read命令中, 使用管道echo输出来设置变量将会失败. 然而, 使用管道cat输出看起来能够正常运行. cat file1 file2 | while read line 2 .while被放置在子shell中。 #!/bin/sh # readpipe.sh # Bjon Eriksson . 5 last="(null)" cat $0 | while read line do echo "{$line}" last=$line done printf "\nAll done, last:$last\n" 14 exit 0 # 代码结束. # 下边是脚本的(部分)输出. # 'echo'出了多余的大括号. 18 ############################################# 20 ./readpipe.sh 22 {#!/bin/sh} {last="(null)"} {cat $0 |} {while read line} {do} {echo "{$line}"} {last=$line} {done} {printf "nAll done, last:$lastn"} 32 All done, last:(null) 35 变量(last)被设置在子shell中, 并没有被设置在外边. 在许多Linux发行版上,

Golang中的buffer

匆匆过客 提交于 2019-12-05 01:04:31
io重要的接口 在介绍buffer之前,先来认识两个重要的接口,如下边所示: type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) } 上边两个接口在golang sdk安装目录src/io/io.go中定义。后边凡是涉及到io相关操作的,基本上都实现了这两个接口,如: 1. package bufio 中的Reader类 2. package bytes 中的Reader类与Buffer类 3. package os 中 的File类,这个实现的最为复杂,主要由于在文件操作中,需要系统底层提供服务。 ...不再一一列举... 经常听说有这么一句话:“使用I/O buffer,有助于提高效率”。但是,我想反问的是,真的提高了效率了吗? buffer在什么情况下会提高我们的程序性能呢?带着这个问题,我们来剖析一下上边提到的几个类。 1.第一个类bytes.Reader 这个类,实现了io.Reader接口,但是这个类没有实现io.Writer接口。这个类没有buffer,为啥?因为这个类,在初始化时,将字符流传入到对象中保存,没有提供Write方法写入新的字符流。所以,这个类不需要buffer。 2

08. 文件操作

妖精的绣舞 提交于 2019-12-05 00:39:00
08. 万恶之源 - 文件操作 本节主要内容: 初识 文件操作 只读(r, rb) 只写(w, wb) 追加(a, ab) r+读写 w+写读 a+写读(追加写读) 其他操作 方法 文件的修改以及另 一种打开 文件句句柄的 方式 主要内容: 一. 初识 文件操作 使 用python来读写 文件是非常简单的操作. 我们使 用open()函数来打开 一个 文件, 获取到 文件句句柄. 然后通过 文件句句柄就可以进 行行各种各样的操作了了. 根据打开 方式的不同能够执 行行的操作也会有相应的差异. 打开 文件的 方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使 用的是r(只读)模式 二. 只读操作(r, rb) f = open("护 士少妇嫩模.txt",mode="r", encoding="utf-8") content = f.read() print(content) f.close() 需要注意encoding表 示编码集. 根据 文件的实际保存编码进 行行获取数据, 对于我们 而 言. 更更多的是utf-8. rb. 读取出来的数据是bytes类型, 在rb模式下. 不能选择encoding字符集. f = open("护 士少妇嫩模.txt",mode="rb" ) content = f.read()

Python文件处理

不想你离开。 提交于 2019-12-05 00:36:46
一、 字符编码 Python3中str都是Unicode编码的,所以Python3中的str类型的数据可以编码成其他字符编码的格式,编码的结果为bytes类型。 # coding:gbk x = '上' # 当程序执行时,无需加u,'上'也会被以Unicode形式保存新的内存空间中, print(type(x)) # <class 'str'> # x可以直接encode成任意编码格式 print(x.encode('gbk')) # b'\xc9\xcf' print(type(x.encode('gbk'))) # <class 'bytes'> 二、基本的文件操作 1、读文件 # read模式打开文件 f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='r') # 读取文件内容,向操作系统发起读请求,会被操作系统转成具体的硬盘操作,将内容由硬盘读入内存 data = f.read() print(data) # 由于Python的垃圾回收机制只回收引用计数为0的变量,但是打开文件还占用操作系统的资源,所以我们需要回收操作系统的资源资源 # del f 只是回收变量f f.close() 2、写文件: # write模式打开文件 f = open(r'/Users/mac/desktop

c语言read()返回-1,errno:Connection reset by peer

时光怂恿深爱的人放手 提交于 2019-12-05 00:36:10
问题描述:服务器端执行完send()后调用close()关闭socket,然后exit()正常退出。客户端read()函数返回-1,errno104 : Connection reset by peer,查了一下原因: 这意味着收到了TCP RST包,可以使用tcpdump + wireshark抓包分析,并且连接现在已经关闭,这种情况可能是因为对方崩溃,或者对方调用了close()函数。 解决方法:只要TCP栈的读缓冲里还有未读取(read)数据,则调用close时会直接向对端发送RST。服务器在调用close()函数前,调用shutdown(socket, 2),先关闭socket的读写功能,这时会向客户端发送FIN包,客户端收到FIN包时read()正常返回0,可以完全读取缓冲数据,问题解决。 close()和shutdown()的区别: 请参考: https://blog.csdn.net/xyyaiguozhe/article/details/30252559 来源: CSDN 作者: ferghs 链接: https://blog.csdn.net/busai2/article/details/81350973

golang 解读(2) sync.Map

与世无争的帅哥 提交于 2019-12-04 23:57:07
sync.map就是1.9版本带的线程安全map. [[在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错, 所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。 在Go官方blog的Go maps in action一文中,提供了一种简便的解决方案。 var counter = struct{ sync.RWMutex // 读写锁 m map[string]int }{m: make(map[string]int)} 它使用嵌入struct为map增加一个读写锁。 读数据的时候很方便的加锁: counter.RLock() // 读锁定 n := counter.m["some_key"] counter.RUnlock() fmt.Println("some_key:", n) 写数据的时候: unter.Lock() // 写锁定 counter.m["some_key"]++ counter.Unlock() golang中sync包实现了两种锁 Mutex (互斥锁:适用于读写不确定场景,即读写次数没有明显的区别,并且只允许只有一个读或者写的场景,所以该锁叶叫做全局锁) 和RWMutex(读写锁:该锁可以加多个读锁或者一个写锁

go中的sync.Map

∥☆過路亽.° 提交于 2019-12-04 23:54:15
Go 1.9中的sync.Map提供了线程安全的map,它的优点总结如下:(网上找的) 1.空间换时间。 通过冗余的两个数据结构(read、dirty),实现加锁对性能的影响。 2.使用只读数据(read),避免读写冲突。 3.动态调整,miss次数多了之后,将dirty数据提升为read。 4.double-checking。 5.延迟删除。 删除一个键值只是打标记,只有在提升dirty的时候才清理删除的数据。 6.优先从read读取、更新、删除,因为对read的读取不需要锁。 其实当我们读完它内部实现后就能很好地理解以上好处了。 先从Map的数据结构看起 type Map struct { mu Mutex read atomic.Value // readOnly dirty map[interface{}]*entry misses int } Mutex加锁的工具,read一个只读的数据结构,所以对它的读总是线程安全的。dirty是map结构,它包含整个Map中的最新的entries,它不是线程安全的,为了保证多线程安全的情况下操作它,需要对它加锁;当dirty为空时,下一次写操作会复制read字段中未删除的数据到dirty。misses计数器,当从Map中读取entry的时候,如果read中不包含这个entry,会尝试从dirty中读取,这个时候会将misses加一,

Go 1.9 sync Map 源码阅读笔记

那年仲夏 提交于 2019-12-04 23:53:41
一、sync Map 包整体结构 本文主要阐述:Load、Store、Delete,更加详细的阐述可以参考源码描述(建议先大体浏览一下Map源码)。 导言: 空间换时间。 通过冗余的两个数据结构(read、dirty),实现加锁对性能的影响。 使用只读数据(read),避免读写冲突。 动态调整,miss次数多了之后,将dirty数据提升为read。 double-checking。 延迟删除。 删除一个键值只是打标记(会将key对应value的pointer置为nil,但read中仍然有这个key:key;value:nil的键值对),只有在提升dirty的时候才清理删除的数据。 优先从read读取、更新、删除,因为对read的读取不需要锁。 虽然read和dirty有冗余数据,但这些数据是通过指针指向同一个数据,所以尽管Map的value会很大,但是冗余的空间占用还是有限的。 二、基础数据结构 1、Map // Map is a concurrent map with amortized-constant-time loads, stores, and deletes. // It is safe for multiple goroutines to call a Map's methods concurrently. // // It is optimized for use

golang中map的并发 syncmap详解

只谈情不闲聊 提交于 2019-12-04 23:53:01
golang中map当前版本默认直接并发写会报concurrent map writes 错误 在golang中要实现并发读写的话有三种目前通用的方式: 1. 使用读写锁sync.RWMutex,在读的时候使用读锁,使用的时候如下代码,效率较低: var counter = struct{ sync.RWMutex //读写锁 m map[string]int }{m: make(map[string]int)} counter.RLock() // 读锁定 n := counter.m["some_key"] counter.RUnlock() unter.Lock()// 写锁定 counter.m["some_key"]++ counter.Unlock() 2. 使用golang官方包的syncmap,效率比第一种方式要高。源码在原生包sync.Map,或者github: https://github.com/golang/sync/tree/master/syncmap 3. 使用其他开源包的concurrentmap,或者自己实现,可以参考java的concurrentmap,使用shard将数据分块,每个锁只针对一个块。 该文章主要讲syncmap的流程,并在源码中翻译原来注释加入一些中文注释帮助理解, 配合源码食用效果更佳。 总述: syncmap是由两个map构成