摘要: 一、线程同步 条件变量 什么是条件变量? 线程A等待某个条件成立,条件成立,线程A才继续向下执行。线程B的执行使条件成立,条件成立以后唤醒线程A,以继续执行。这个条件就是条件变量。 pthread_cond_t 类型 就是条件变量的类型 对类型的封装如下: #include //条件变量的静态初始化 pthread_cond_t cond = PTHREAD_COND_INITIALI... 阅读全文
posted @ 2017-10-25 21:59 Kernel001 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 一、基于UDP的网络编程模型 服务器端 1、创建socket. 2、将fd和服务器的ip地址和端口号绑定 3、recvfrom阻塞等待接收客户端数据 4、业务处理 5、响应客户端 客户端: 1、创建socket 2、向服务器发送数据sendto 3、阻塞等待服务器的响应信息 4、处理响应信息 5、断开通讯 #include #include ssize_t recvfrom(int s... 阅读全文
posted @ 2017-10-25 21:58 Kernel001 阅读(413) 评论(0) 推荐(0) 编辑
摘要: 一、基于TCP传输层的编程模型 TCP是面向连接的,安全可靠的。 三次握手 服务器端编程模型 1、创建一个用于网络通讯的设备 通讯端点 socket(2) #include #include int socket(int domain, int type, int protocol); 功能:创建一个用于通讯的端点 参数: domain: AF_INET:应用于IPV4地址家族的 AF_I... 阅读全文
posted @ 2017-10-25 21:57 Kernel001 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 一、共享内存 1、获取一个键值 ftok(3) 2、使用键值获取共享内存的id shmget(2) #include #include int shmget(key_t key, size_t size, int shmflg); 功能:分配一块共享内存段。获取和key值相关的共享内存段的id。 参数: key:ftok(3)的返回值 size:指定了共享内存段的尺寸 shmflg:... 阅读全文
posted @ 2017-10-25 21:56 Kernel001 阅读(391) 评论(0) 推荐(0) 编辑
摘要: 一、pause(2)的使用 #include int pause(void); 功能:等待信号的到来 返回值: -1 错误 errno被设置 只有在信号处理函数执行完毕的时候才返回。 利用所学的知识,编码实现sleep函数的功能。 unsigned int psleep(unsigned int seconds); 代码参见 psleep.c 二、信号从产生到处理的全过程 1、... 阅读全文
posted @ 2017-10-25 21:55 Kernel001 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 一、管道 管道分为两种: 无名管道 有名管道 无名管道用于具有亲缘关系的进程间通讯。无名管道是单工的。 有内核管理的一块内存空间。 使用管道,系统提供了pipe(2) #include int pipe(int pipefd[2]); 功能:创建管道 参数: pipefd[2]:用于返回管道的两端。pipefd[0]指向管道的读端。 pipefd[1]指向管道的写端。 返回值: 0... 阅读全文
posted @ 2017-10-25 21:52 Kernel001 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 一、环境变量 bash下的环境变量。 每个进程都默认从父进程继承环境变量 bash本身就是一个程序,这个程序运行的时候,bash进程 可以定义只能之自己这个进程中使用的变量,这种变量称为自定义变量。 用户可以使用 export 环境变量的名字 将自定义变量变为环境变量。环境变量可以被子进程继承。 如何使用程序访问环境变量? 系统维护着一个全局变量 extern char **environ... 阅读全文
posted @ 2017-10-25 21:51 Kernel001 阅读(650) 评论(0) 推荐(0) 编辑
摘要: 进程的管理 一、进程的基础 进程和程序的区别 每个进程有自己的pid、PCB 操作系统上运行的所有进程构成一颗树。 如何查看这颗树? pstree(1) 树根进程是init pid是 1 进程间的亲缘关系两种 父子关系 兄弟关系 使用top(1)命令观察进程的状态 使用ps(1)命令也可以查看进程。 二、进程的创建 父进程创建子进程 父进程如何去创建子进程? 父进程调用fork... 阅读全文
posted @ 2017-10-25 21:50 Kernel001 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 一、获取文件的元数据(meta data) 通过read write可以对文件的内容进行读写。 但是今天我们要操作的是文件的元数据(文件的属性信息) day08$ls -l hello -rw-rw-r-- 1 tarena tarena 0 8月 9 09:17 hello 文件的类型 文件的权限 文件的硬链接数 属主 属组 文件的大小 时间 文件的链接 分为两种 硬链接和软链接 每... 阅读全文
posted @ 2017-10-25 21:49 Kernel001 阅读(623) 评论(0) 推荐(0) 编辑
摘要: 一、lseek(2)重新定位文件的读写位置。 #include #include off_t lseek(int fd, off_t offset, int whence); 功能:重新定位文件读写位置距离文件起始的偏移 参数: fd:指定了具体的文件 offset:偏移 whence: SEEK_SET:offset就是文件的偏移位置 指向文件的头部 SEEK_CUR:代表当前位... 阅读全文
posted @ 2017-10-25 21:47 Kernel001 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 一、malloc的实现机制(缓冲机制) 库函数跟系统调用之间的关系 什么是缓冲? 内存分配的原理。 封装 函数A的实现代码中调用了函数B。函数B的功能是函数A主要的功能,这样就说函数A封装了函数B。 举例说明 malloc的实现机制(缓冲) 代码参见malloc.c 080f8-08119 33块 内存管理结束了 二、文件的操作(文件内容的操作) 文件的打开、关闭、读、写、读... 阅读全文
posted @ 2017-10-25 21:46 Kernel001 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 一、内存管理(续) 每个进程都有自己独立的4G的虚拟地址空间。 冯.诺伊曼体系结构 哈佛体系结构 section 代码段 只读数据段 栈段 举例说明 数据所属的段。 代码参见 memory.c 如何获取进程自己的pid? getpid(2) #include #include pid_t getpid(void); 功能:获取进程的id 参数: void 返回值: pi... 阅读全文
posted @ 2017-10-25 21:43 Kernel001 阅读(733) 评论(0) 推荐(0) 编辑
摘要: 一、程序中的错误处理 在系统中定义了一个全局变量errno。在这个全局变量中存放着系统调用或者库函数出错的信息(错误编号)。然后根据错误编号获取错误信息。 举例说明: 打开一个文件,如果这个文件不存在,查看错误信息。 代码参见 file.c perror(3) strerror(3) #include void perror(const char *s); 功能:输出一条系统的错误消... 阅读全文
posted @ 2017-10-25 21:41 Kernel001 阅读(1002) 评论(0) 推荐(0) 编辑
摘要: 一、为类型命名别名 struct node{ int num; struct node *next; }; typedef struct node node_t; node_t n; 使用typedef为类型定义别名。 三个步骤: 1、定义一个类型的变量或常量 2、在第一步的基础上,在最前边加上typedef关键字,这时候,原来的变量或常量就是类型的别名(新类型)。 3、使用新... 阅读全文
posted @ 2017-10-25 21:39 Kernel001 阅读(541) 评论(0) 推荐(0) 编辑
摘要: 一、大型软件组织 定义规则,规则就是协议。用户和中介的接口。 软件开发的过程: 定义规则,定义协议。软件为用户提供的功能。 在C语言中使用接口实现。接口就是函数。 两种用户 函数的使用者 函数的实现者 你要站在函数的实现者角度考虑函数。 1、函数要完成的功能 2、需要传递给函数的参数 3、函数的返回值的类型 附加信息 作者: 时间: 将协议的每个部分都要实现,在C语言中如何来表示协议... 阅读全文
posted @ 2017-10-25 21:37 Kernel001 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 一、计算机的框架 什么是操作系统?(汽车) 加油系统 油门 用户跟加油子系统交互的窗口。(接口) 方向系统 方向盘 用户跟方向系统的交互接口。 导航系统 。。。 汽车的操作系统有很多的子系统来完成。这些子系统互相协调工作,达到用户的目的。操作简练、效率高、安全性比较高...。 接口 多个子系统 每个子系统负责单一的工作。 操作环境 驾驶员位置 是不是驾驶员直... 阅读全文
posted @ 2017-10-25 21:35 Kernel001 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 二十三 运行时的类型信息 1 typeid运算符 #include typeid(类型/对象) 1)返回typeinfo的对象,用于描述类型信息。 2)在typeinfo类中包含了一个name()成员函数返回字符串形式类型信息。 3)typeinfo类支持"=="、"!="的操作符重载,可以直接进行类型之间的比较,如果类型之间存在多态的继承关系,还可以利用多态的特性确定实际的对象类型。 eg:... 阅读全文
posted @ 2017-10-25 17:06 Kernel001 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 二十二 多态(Polymorphic) 1 函数重写(虚函数覆盖)、多态概念 如果将基类中的某个成员函数声明为虚函数,那么子类与其具有相同原型的成员函数就也将是虚函数,并且对基类中的版本形成覆盖。 这时,通过指向子类对象的基类指针,或者引用子类对象的基类引用,调用该虚函数,实际被执行的将是子类中覆盖版本,而不是基类中的原始版本,这种语法现象称为多态. eg: class Bas... 阅读全文
posted @ 2017-10-25 17:05 Kernel001 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 二十一 继承(Inheritance) ... 5 子类的构造函数和析构函数 5.1 子类的构造函数 1)如果子类构造函数没有显式指明基类子对象的初始化方式,那么该子对象将以无参方式被初始化。 2)如果希望基类子对象以有参的方式被初始化,必须在子类构造函数的初始化表中显式指明。 class 子类:public 基类{ 子类(...):基类(基类子对象构造实参表){} }; 3)... 阅读全文
posted @ 2017-10-25 17:03 Kernel001 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 二十 操作符重载 5 函数操作符"()" 功能:让对象当做函数来使用 注:对参数的个数、返回类型没有限制 eg: class A{...}; A a; //a.operator()(100,200) a(100,200); 6 下标操作符"[]" 功能:让对象可以当做数组一样去使用 注:非常对象返回左值,常对象返回右值 eg: string s("hello"); //s.opera... 阅读全文
posted @ 2017-10-25 17:02 Kernel001 阅读(288) 评论(0) 推荐(0) 编辑