摘要: epoll 服务器 监听 fd 可读 epoll返回 read 小写转大写 write epoll继续监听 反应堆模型 epoll 服务器 监听 cfd 可读 epoll返回 read cfd从树上摘下 设置监听cfd写时间(滑动窗口), 操作 小写转大写 等待epoll_wait返回 回写客户端 阅读全文
posted @ 2019-04-19 21:52 张飘扬 阅读(735) 评论(1) 推荐(1) 编辑
摘要: `ssize_t read(int fildes, void buf, size_t nbyte);` 返回值: 0: 实际读到的字节数 = 0: 读完数据(读文件, 管道, socket末尾 对端关闭, 对端未关闭会一直等待) 1: 异常: errno == EINTR被信号中断, 重启或者退出 阅读全文
posted @ 2019-04-19 21:51 张飘扬 阅读(4008) 评论(0) 推荐(0) 编辑
摘要: dup与dup2 改变已经打开的文件的属性 变参数函数 复制一个已经有的文件描述符 int ret = fcntl(fd, F_DUPFD); 获取/设置文件状态标志 open的flags参数 (1)获取文件状态标识 int flag = fcntl(fd, F_GETFL); (2)设置文件状态标 阅读全文
posted @ 2019-04-19 21:50 张飘扬 阅读(177) 评论(0) 推荐(0) 编辑
摘要: [toc] stat/lstat stat穿透 lstat不穿透 两者主要的区别在于连接文件 st_mode: 文件的类型和存取权限 获取文件大小测试 权限测试 access 测试当前用户指定文件是否具有某种属性 当前用户, 使用哪个用户调用这个函数, 这个用户就是当前用户 参数: pathname 阅读全文
posted @ 2019-04-19 21:48 张飘扬 阅读(301) 评论(0) 推荐(0) 编辑
摘要: [toc] chdir path: 切换的路径 getcwd 参数: buf: 缓冲区, 存储当前的工作目录 size: 缓存区大小 返回值: 成功: 当前的工作目录 失败: NULL C include include include include include include int mai 阅读全文
posted @ 2019-04-19 21:48 张飘扬 阅读(377) 评论(0) 推荐(0) 编辑
摘要: poll 文件描述符突破1024, 修改配置文件 监听和返回集合分离 搜索范围变小 如果不再监控某个文件描述符时, 可以把pollfd中, fd设置为 1, 破灵力不再监控此pollfd, 下次返回时, 把revents设置为0 返回值: 返回满足条件事件数 参数: fds: 数组的首地址 ndfs 阅读全文
posted @ 2019-04-19 21:43 张飘扬 阅读(747) 评论(0) 推荐(0) 编辑
摘要: [toc] epoll epoll是linux下多路复用I/O接口select和poll的增强版本, 他能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率, 因为它会复用文件描述符集合来传递结果, 而不用迫使开发者每次等待事件之前都必须重新准备要被监听的文件描述符集合. 另一点原因 阅读全文
posted @ 2019-04-19 21:43 张飘扬 阅读(567) 评论(0) 推荐(0) 编辑
摘要: 多路I/O转接服务器 多路IO转接服务器也叫多任务IO服务器. 该类服务器实现的主旨思想是, 不再有应用程序自己见识客户端连接, 取而代之有内核替应用程序监视文件 select select缺点: 1. 同时监听文件描述符上限是1024, 修改配置文件后依旧是1024, 重新编译内核可改 2. 使用 阅读全文
posted @ 2019-04-19 21:42 张飘扬 阅读(379) 评论(0) 推荐(0) 编辑
摘要: 信号量(信号灯) mutex初始化为1 lock之后为0 unlock之后为1 mutex实现的同步都是串行的 sem相当于有多个mutex, 并行 (1) 头文件: semaphore.h (2) 信号量类型: sem_t; 加强版互斥锁 (3) 主要函数 初始化信号量: 0 线程同步 1 进程同 阅读全文
posted @ 2019-04-19 21:40 张飘扬 阅读(367) 评论(0) 推荐(0) 编辑
摘要: (1) 条件变量是锁? 不是锁 , 但是条件变量能够阻塞线程, 调用阻塞函数开始阻塞 使用条件变量+互斥量 互斥量: 保护一块共享数据 保护数据 条件变量: 引起阻塞, 生产者和消费者模型 阻塞线程 (2) 条件变量的两个动作 条件不满足: 阻塞线程 条件满足: 通知阻塞的线程开始工作 (3) 条件 阅读全文
posted @ 2019-04-19 21:39 张飘扬 阅读(2011) 评论(0) 推荐(0) 编辑
摘要: (1) 读写锁是几把锁 一把锁 pthread_rwlock_t lock; (2) 读写锁的类型 读锁: 对内存做读操作 写锁: 对内存做写操作 (3) 读写锁的特性: 线程A加读锁成功, 又来了三个线程, 做读操作, 可以加锁成功 读共享, 并行处理 线程A加写锁成功, 又来了三个线程, 做读操 阅读全文
posted @ 2019-04-19 21:38 张飘扬 阅读(1491) 评论(0) 推荐(1) 编辑
摘要: 互斥量(互斥锁) (1) 互斥锁类型: pthread_mutex_t, 定义一个变量相当于创建一把锁 (2) 互斥锁的特点 多个线程传行访问共享数据 (3) 使用互斥锁缺点 效率低 (4) 互斥锁的使用步骤 创建互斥锁: 初始化: 加锁 阻塞线程 如果上锁, 直接返回, 不阻塞, 需要对返回值进行 阅读全文
posted @ 2019-04-19 21:38 张飘扬 阅读(309) 评论(0) 推荐(0) 编辑
摘要: [toc] 基础API 头文件: 失败返回错误号, 不能用perror打印错误信息, 使用strerror(ret) pthread_self 返回线程ID, 在linux下是无符号整数(%lu), 在其他系统中可能是结构体实现 线程ID是内部标识, 两个进程间, 线程ID可以相同 pthread_ 阅读全文
posted @ 2019-04-19 21:36 张飘扬 阅读(853) 评论(0) 推荐(0) 编辑
摘要: 造成死锁的原因 (1)自己锁自己 for (int i = 0; i A锁; 线程2对共享资源B加锁成功 B锁 线程1访问共享资源B, 对B加锁 线程1阻塞在B锁上 线程2访问共享资源A, 对A加锁 线程2阻塞在A锁上 解决方法 1. 使线程安装一定顺序去访问共享资源 2. 在访问其他锁的时候, 需 阅读全文
posted @ 2019-04-19 21:36 张飘扬 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 线程 线程相关概念: 查看指定线程的LWP号 线程号和线程ID有区别; 用户查看线程ID, 内核查看线程号 找到程序的进程ID, 然后执行ps Lf pid 创建线程之后, 地址空间没有变化; 进程退出成线程 主线程; 创建出的子线程和主线程共用地址空间; 主线程和子线程有各自独立的pcb, 子线程 阅读全文
posted @ 2019-04-19 21:34 张飘扬 阅读(162) 评论(0) 推荐(0) 编辑
摘要: [toc] 终端 在UNIX系统中, 用户通过终端登录系统后得到一个Shell进程, 这个终端成为Shell进程的控制终端(Controlling Terminal), 进程中, 控制终端是保存在PCB中的信息, 而fork会复制PCB中的信息, 因此由Shell进程启动的其它进程的控制终端也是这个 阅读全文
posted @ 2019-04-19 21:33 张飘扬 阅读(1350) 评论(0) 推荐(0) 编辑
摘要: [toc] 基础API 该函数由ANSI定义, 由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为. 因此应该尽量避免使用它, 取而代之使用sigaction函数 重点掌握 1. sa_handler: 指定信号捕捉后的处理函数名(即注册函数)。也可赋值为SIG_IGN表忽略或 阅读全文
posted @ 2019-04-19 21:24 张飘扬 阅读(287) 评论(0) 推荐(0) 编辑
摘要: [toc] 基本概念 概念: 信号产生处于未决状态, 进程收到信号之后, 信号被放入未决信号集; 放入未决信号集的信号等待处理之前, 先判断阻塞信号集中该信号对应的标志位是否为1(不处理), 0为处理; 当阻塞信号集对应的标准位为0时, 该信号被处理 未决信号集: 没有被当前进程处理的信号集 阻塞信 阅读全文
posted @ 2019-04-19 21:23 张飘扬 阅读(227) 评论(0) 推荐(0) 编辑
摘要: [toc] 信号概念 信号机制 A给B发送信号, B收到信号之前执行自己的代码, 收到信号后, 不管执行到程序的什么位置, 都要暂停运行, 去处理信号, 处理完毕再继续执行, 与硬件中断类似——异步模式. 但信号是软件层面上实现的中断, 早期常被称为“软中断” 信号的特质: 由于信号是通过软件方法实 阅读全文
posted @ 2019-04-19 21:22 张飘扬 阅读(241) 评论(0) 推荐(0) 编辑
摘要: [toc] 存储映射 存储映射I/O(Memory mapped I/O)使一个磁盘文件与存储空间中的一个缓冲区相映射. 于是当从缓冲区中取数据, 就相当于读文件中的相应字节. 与此类似, 将数据存入缓冲区, 则相应的字节就自动写入文件. 这样, 就可在不适用read和write函数的情况下, 使用 阅读全文
posted @ 2019-04-19 21:21 张飘扬 阅读(2571) 评论(0) 推荐(0) 编辑