摘要:
之前讲述了如何利用readdir/readdir_r,对指定目录进行遍历并输出,参见:Linux C 讲解系统调用readdir, readdir_r 以及如何遍历目录下的所有文件 这里讲述利用scandir和alphasort如何遍历指定目录,并对文件名排序输出。 scandir,alphasor 阅读全文
摘要:
系统调用基本概念 为了和用户空间上运行的进程进行交互,内核提供了一组接口,透过该接口,应用程序可以访问硬件设备和其他操作系统资源。这组接口称为系统调用。 系统调用是用户空间和硬件设备之间添加的一个中间层,主要作用: 1)为用户空间提供一种硬件的抽象接口。 2)保证系统的稳定和安全。 3)每个进程都运 阅读全文
摘要:
背景 Linux中断上半部,参见Linux中断和中断处理程序 。 Linux中断下半部,参见Linux中断下半部及推后执行的工作。 这部分讲Linux内核中断和中断处理程序。 [ ] 中断 硬件中断 -- 异步中断 中断本质上是一种电信号,由硬件设备发出,用于通知处理器特定事件。 不同设备对应不同中 阅读全文
摘要:
计时函数 用于获取当前(日期)时间: time(2) / time_t (秒) ftime(3) / struct timeb (毫秒) gettimeofday(2) / struct timeval (微妙) clock_gettime(2) / struct timespec (纳秒) gmt 阅读全文
摘要:
这部分讲Linux内核定时器。 基本概念 系统定时器:一种可编程硬件芯片,能以固定频率产生中断。 定时器中断:系统定时器固定时间周期产生的中断,其中断处理程序负责更新系统时间,执行周期性任务。 动态定时器:一种用来推迟执行程序的工具。内核可以动态创建、销毁动态定时器。 节拍率(tick rate): 阅读全文
摘要:
这部分讲操作系统内核中的并发和同步问题。 为什么需要同步? 因为计算机中很多共享的资源有限,如共享内存,在同一时间被多个执行并发访问的话,有可能发生各个线程间相互覆盖共享数据的情况,造成访问数据处于不一致状态,从而造成系统不稳定的隐患,而且很难跟踪和调试。 而同步就是保护共享资源的手段,避免同一时刻 阅读全文
摘要:
Linux内核提供一组同步方法,用于避免共享数据之间的竞争: 内核态进程的非抢占性 原子操作 关中断 锁 [ ] 内核态进程的非抢占性 Linux内核是非抢占的:正在运行的进程处于内核态时,不会被抢占,即使来了优先级更高进程。 以下断言,在Linux中总是成立: 内核态运行的进程不会被其他进程取代, 阅读全文
摘要:
基本概念 函数将一个或多个实参传递给其他函数,这个过程称为转发。 完美转发(perfect forwarding)是指转发过程中,保持被转发实参的所有原始性质,包括实参类型是否为const,左值 or 右值等。 转发 转发示例 编写一个转发的示例:翻转函数flip1能将2个参数逆序,传递给函数f。 阅读全文
摘要:
什么是智能指针? 智能指针是存储指向动态分配(位于堆)对象指针的类,用于生存期控制,能确保在离开指针所在作用域时,自动正确地销毁动态分配的对象,以防止内存泄漏。 智能指针通常通过引用计数技术实现:每使用一次,内部引用计数+1;每析构一次,内部引用计数-1,当减为0时,删除所指堆内存。 C++11提供 阅读全文
摘要:
异步操作简介 什么是异步操作,为何会有异步操作? 在C++中,不能直接从thread.join()得到结果,必须定义个变量,在线程执行时,对这个变量赋值,然后执行join(),过程相对繁琐。 Linux中有AIO(异步IO)做异步操作,C++中如何进行异步操作? 答:是有的,C++11提供了异步操作 阅读全文
摘要:
互斥量 C++11提供4种互斥量(mutex)语义,对于4个类: std::mutex 独占互斥量,不能递归加锁; std::timed_mutex 带超时的独占互斥量,超时自动解锁,不能递归加锁; std::recursive_mutex 递归互斥量,不带超时解锁功能; std::recursiv 阅读全文
摘要:
读写锁基本概念 读写锁(readers-writer lock),又称为多读单写锁(multi-reader single-writer lock,或者MRSW lock),共享互斥锁(shared-exclusive lock),以下简称RW lock。 读写锁用来解决读写操作并发的问题。多个线程 阅读全文
摘要:
第43条:算法调用优先于手写的循环 对于许多C++程序员来说,编写一个循环比调用一个算法更自然,而且读懂循环代码比读懂mem_fun_ref或mem_fun更容易。为什么要优先调用算法,而不是手写循环呢? 因为三个理由: 效率:算法通常比程序员自己写的循环效率更高。 正确性:自己写循环比使用算法更容 阅读全文
摘要:
std::bind 之前这篇文章已经讲过C++ 参数绑定bind(适用于C++11以后),参见 C++ Primer学习笔记 - 参数绑定bind。 using namespace placeholders; // or using std::placeholders::_1; auto f = b 阅读全文
摘要:
函数子、函数子类的基本概念 所有重载了函数调用操作符(operator())的类都是一个函数子类(又称函数类型)。 从这些类创建的对象被称为函数对象,或函数子(functor)。 也就是说,函数子类是一种class,而函数子是这个class的一个object。函数子类可用作模板的参数类型,而函数子则 阅读全文
摘要:
插入迭代器 当通过insert、push_front、push_back等方式加入新对象到STL容器时,容器会自动扩充存储空间以存储这些对象。但STL容器并不总是能正确管理其存储空间。 例如, int transmogrify(int x); // 根据x生成一个新值 vector<int> val 阅读全文
摘要:
第26条:iterator优先于const_iterator、reverse_iterator以及const_revserse_iterator STL标准容器提供4种不同的迭代器类型:iterator、const_iterator、reverse_iterator、const_reverse_it 阅读全文
摘要:
第19条:理解相等(equality)和等价(equivalence)的区别 相等关系 相等基于operator==。如果表达式“xy”返回true,则x和y值相等;否则,不相等。 相等不一定意味着等价。比如,Widget类内部有一个记录最近一次被访问的时间,而operator可能忽略该域 clas 阅读全文
摘要:
第13条:vector和string优先于动态分配的数组 使用new来动态分配内存,意味着使用者将承担责任: 必须确保有人会用delete删除所分配内存。如果没有,new将导致内存泄漏; 必须确保使用正确delete形式。单个对象删除用delete,数组删除用delete[]; 必须确保只delet 阅读全文
摘要:
第1条:慎重选择容器类型 C++提供容器 标准STL顺序容器:vector、string、deque、list; 标准STL关联容器:set、multiset、map和multimap; 非标准顺序容器slist和rope。 slist(单向链表), rope(可持久化平衡树)是SGI STL(ST 阅读全文