/android-chrome-192x192.png

ImCBC

自由 分享 合作

  

glibc-fopen源码阅读-补充篇-open系统调用

本文补充分析了glibc中fopen函数的底层实现,重点探讨了系统调用openat如何获取文件描述符(fd)以及struct file如何与文件内容关联。文章详细解析了openat调用的do_sys_open函数的执行流程,包括open flags的构建、文件名解析、文件描述符分配、文件打开、文件系统通知以及文件注册到进程的过程。通过追踪do_filp_open函数,作者解释了如何通过path_lookupat获取文件的inode信息,并通过vfs_open完成文件的打开操作。最后,文章简要提及了fsnotify_openfd_install的作用,展示了文件描述符与进程文件表的关联机制。

《UCB CS61a SICP Python 中文》一周目笔记(二)

本文是《UCB CS61a SICP Python 中文》第二章的学习笔记,聚焦于数据抽象和对象构建。作者探讨了构造器和选择器的设计原则,强调数据抽象应减少用户对数据表示的关注,并通过复数的实现示例说明了如何统一接口。文章还介绍了约束传播的概念及其在摄氏度与华氏度转换中的应用,展示了通过连接器和约束条件实现自动更新的过程。此外,作者讨论了函数与方法的设计选择,并通过字典模拟类和对象,提供了灵活的实现方式。

程序的栈帧

本文详细解析了程序栈帧的概念及其在函数调用中的作用,通过分析x86-64架构下的汇编代码,展示了栈帧的创建、局部变量的存储、函数参数的传递及函数调用和返回的过程。文章还探讨了栈帧的动态增长特性,并通过代码示例演示了如何利用栈帧的特性实现“黑魔法”访问子函数的局部变量。此外,作者提出了栈帧在程序运行中可能带来的安全隐患,并总结了栈帧的本质是保存程序运行局部变量的栈,而非包含执行指令。

glibc-exit源码阅读

本文详细解析了glibc中exit函数的源码实现,重点分析了__run_exit_handlers函数的三个阶段:首先调用__call_tls_dtors析构线程局部存储(TLS)变量;其次处理exit_function_list链表,执行编译器或用户注册的退出函数;最后调用__libc_atexit进行IO清理并通过_exit系统调用终止进程。此外,文章还探讨了returnexit的区别,指出return用于函数栈帧的退出,而exit则负责整个进程的退出。文章还简要介绍了_start函数作为程序入口的作用,以及main函数的返回值如何通过exit传递给父进程。

glibc-abort源码阅读

本文通过源码分析和测试,探讨了glibc中abort函数的实现原理及其与raise、exit的区别。作者详细解析了abort的多阶段处理流程,包括信号掩码设置、SIGABRT信号发送、默认信号处理函数绑定以及后备退出机制。文章还通过代码示例验证了abort会导致整个进程退出,并提出了对raise、exit可能失败场景的疑问,为进一步研究提供了方向。

几种定投策略的仿真比较

本文通过Python代码模拟了三种基金定投策略的收益表现,包括浮动定投、一次性投入和固定金额定投。仿真结果表明,一次性投入的收益和风险最大,而浮动定投在减少亏损的同时也能获得较高的盈利。文章详细展示了随机生成市场涨跌趋势、执行策略仿真的代码,并总结了各策略的优劣,强调浮动定投在波动市场中的优势。

STL-智能指针三剑客源码阅读

本文深入解析了C++中三种智能指针unique_ptrshared_ptrweak_ptr的实现原理及其应用场景。文章详细介绍了unique_ptr如何通过限制拷贝行为实现独占式内存管理,shared_ptr如何通过引用计数实现共享式内存管理,以及weak_ptr如何解决shared_ptr的循环引用问题。通过源码分析,文章展示了引用计数的实现细节、内存释放机制以及weak_ptr的辅助功能。此外,文章还通过示例代码演示了智能指针的使用方法和注意事项,总结了设计工具类时的关键思路,适合对C++内存管理机制感兴趣的读者。

explicit说明符

本文深入解析了C++中的explicit说明符,阐明其作用是限制隐式行为,仅允许显式行为。通过对比代码示例,作者详细说明了explicit对构造函数和类型转换函数的影响,强调其在防止隐式类型转换中的重要性。文章还探讨了显式行为的优势,引用Python禅宗中的格言“显式优于隐式”,并结合Rust的类型转换机制,进一步说明显式行为对代码安全性和可读性的提升。

rssblog的数据源-rssblog-source

本文介绍了rssblog的改进数据源服务rssblog-source,通过GitHub Actions实现RSS数据的定时抓取、缓存和分类存储。文章详细描述了数据源的配置、抓取流程、数据合并与分类策略,并探讨了备份博文和未来数据分析的可能性。代码示例展示了如何拉取RSS数据并保存为CSV文件,提供了高效管理RSS数据的解决方案。

pair的内存结构

本文探讨了C++中pair类型的内存结构及其相关问题,通过代码实例验证了pairfirst成员地址与基地址一致的结论。作者分析了pair的实现,指出其继承自__pair_base且没有虚函数,成员变量firstsecond直接存储在内存中,因此打印基地址可以正常工作。此外,文章通过扩展验证对比了classstruct的内存结构,发现两者的基地址与第一个成员变量地址一致,但需注意内存对齐问题。作者强调,尽量避免通过基地址访问类成员,以免因内存对齐或封装性问题导致意外行为。本文为深入理解C++内存分布及其潜在问题提供了有价值的参考。