![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 56
“好记性不如烂“博客
这个作者很懒,什么都没留下…
展开
-
使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题!fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数据空间、堆和栈副本,这其中也包括文件描述符。刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着他们共享同一文件偏移量)。接着,一般我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈等。此时转载 2021-11-06 21:34:33 · 258 阅读 · 0 评论 -
fsync与fflush的关系和区别
read/write/fsync与fread/fwrite/fflush的关系和区别read/write/fsync:linux底层操作;内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作。fread/fwrite/fflush:c语言标准规定的io流操作,建立在read/write/fsync之上在用户层, 又增加了一层缓冲机制,用于减少内核调用次数,但是增加了一次内存拷贝。两者之间的关系,见下图:补充:对于输入设备,调用fsync/fflush将清空转载 2021-08-03 22:43:35 · 3826 阅读 · 0 评论 -
缓冲文件系统(fopen/fread/fwrite)和非缓冲文件系统(open/read/write)
open:系统调用,返回的是文件描述符,即文件句柄,是文件在文件描述副表里的索引。fopen:C语言库函数,返回的是一个指向文件结构的指针。fopen是ANSI C标准中的C语言库函数,在不同的操作系统中应该调用不同的内核API,UNIX环境下,fopen是对open的封装。文件描述符是UNIX/Linux下的一个概念,Linux环境下,一切设备皆是文件,一切设备皆是以文件的形式进行操作,如网络套接字、硬件设备等。设备文件不可以当成流式文件来处理,因此,只能使用open,而fopen只是用来操纵正规文转载 2021-08-03 22:35:11 · 2628 阅读 · 0 评论 -
read/fread write/fwrite 的区别
fread就是通过read来实现的,fread是C语言的库,而read是系统调用。差别在read每次读的数据是调用者要求的大小,比如调用者要求读取10个字节数据,read就会从内核缓冲区(操作系统开辟的一段空间用来存储磁盘上的数据)读10个字节数据到数组中,所以每次调用read会涉及到用户态与內核态之间的切换从而损耗一定的性能。而fread不一样,为了加快读的速度,fread每次都会从内核缓冲区读比要求更多的数据,然后放到应用进程缓冲区(首地址存在FILE结构体中),这样下次再读数据只需要到应用进程缓冲区转载 2021-08-03 22:31:01 · 605 阅读 · 0 评论 -
C++11 右值引用与常量左值引用保存临时变量(函数返回值)的底层分析
右值引用保存临时变量(函数返回值)的问题结论:无论是用右值引用还是普通变量保存返回值,最终在函数返回时都是通过eax保存的。区别在于:1、普通变量:就直接将eax赋值给普通变量2、右值引用:就将eax的值放到另一个位置(临时变量),然后再将这个位置的地址赋值到右值引用上。(所以函数返回值的临时变量不是一直存在的,要看返回时用什么类型的变量来接收)...原创 2021-01-20 11:23:47 · 1681 阅读 · 0 评论 -
C++11 std::shared_ptr的std::move()移动语义底层分析
std::shared_ptr的std::move()移动语义底层分析执行std::move()之前:执行std::move()之后:结论:sizeof(std::shared_ptr) = 8字节pss1 : 0x0028fea8pss2 : 0x0028fea0观察执行std::move前,pss1 : 0x0028fea8 开始的8个字节的值,然后执行后 pss1 : 0x0028fea8开始的8个字节的值复制到 pss2 : 0x0028fea0 后,清零pss1 : 0x0原创 2021-01-19 19:59:44 · 4730 阅读 · 0 评论