- 博客(15)
- 收藏
- 关注
原创 C语言epoll实现线程池
/************************************************************************* > File Name: 5.thread_epoll.c > Author: > Mail: > Created Time: Fri 14 Aug 2020 10:59:44 AM CST ********************************************************************
2020-08-14 14:00:43
592
原创 LINUX进程调度
进程调度进程调度是一个内核子系统进程调度的主要任务就是决定哪一个“就绪”状态的进程来执行就绪进程就是非阻塞几次呢好姑娘阻塞的进程就是正在睡眠的进程,需要内核唤醒的进程。从人的理解,就是长久的sleep,周期性检查是不是需要检查。内核会告诉你你准备的东西是否就绪,你是不是已经等完成了找工作会考的三态模型一个进程在启动后有三个状态,分别是就绪、运行、阻塞,进程会一直在这三个状态之间切换,进程在运行的状态是就绪被调度起来就会运行起来,调度到内存中,有可能会发现时间片消耗完,运行到就绪,就绪
2020-08-01 15:58:50
151
原创 如何使用exec()这一族函数。多进程:实现git commit
Execlp(父亲进程,需要等待孩子进程结束,然后为孩子进程收拾尸体。Pid_t wait(int *status);pid_t waitpid(pid_t pid, int *status, int options);@TOC进程退出int *status这个int *,使用的过程中是一个int型地址,父亲进程多了第一个参数pid可以是任何数字的pid < -1 //等待一个进程组id为pid绝对值的任何子进程退出pid = -1 // 等待任何一个子进程退出,wait()p
2020-08-01 15:07:43
166
原创 进程管理
命令:free:打印top:显示当前系统进程,最占内存的是什么情况;一般情况下就是直接使用就可以了。dstat :总的cpu使用率pstree: ps -ef (可以看到任务管理器)pstree -a pstree -n pstree -p pstree -upgrep :pgrep -o:起始的进程号;kill : 删除进程后续会讲kill进程单独怎么用;pkill :批量按照名字删除进程:ping baidu.com &ping haizei,com &
2020-08-01 14:29:21
101
原创 素数筛:
素数筛:进一步优化i * i <= maxj = iIf(prime[i] ) continue; int main(){ int prime[10000+5] = {0}; for (int i = 2; i * i<= 10000; i++){ for(int j = i ; i * j <= 10000; j++)//j 是从i而不是从2开始,因为重复(乘法表) { prime[i*j] = 1;//是不是不能用i*j而应该用 s
2020-07-29 17:49:39
86
原创 LINUX用户管理的重要的配置文件
用户是怎么储存的,uid’,gid用get_pwd_uid获取的,包括了我的用户名,密码位 $HOME每一个用户都有一个HOME $SHELL是用户的SHELL环境学过。。的话,就没有任何问题shadow用户名称 + 加密过的密码 + 密码修改的日期 + 密码不可改动的时间 + 密码需要重新修改的时间 + 密码变更期限前警告时间 + 密码过期的宽限时间 + 账号失效的日期 + 保留group创建用户A, 创chsh -s Shell 如果不指定,那就是我自己chsh -s /bin/zs
2020-07-26 20:09:40
232
原创 文件的读和写—接口部分的讲解
open read write close ;man 2 open;man 2 write//这一套fopen fread fwrite fgets getline fclose//这一套NAME read - read from a file descriptorSYNOPSIS #include <unistd.h>man 2 openNAME open, openat, creat - open and possibly cre
2020-07-26 15:20:09
379
原创 C语言自己实现ls -al 功能,支持更换目录。 利用LINUX命令行解析,实现ls,总结船长
ls -a -l要读入命令行,就读入-,后面的a和l是体现性质的作用这个过程用C语言实现是困难的,需要用脚本语言man 3 getopt查看getopt这个函数的作用
2020-07-26 10:37:20
411
原创 二叉排序树->二叉排序树(->AVL树->SB树) AVL代码演示
二叉排序树、二叉搜索树左子树 < 根节点 < 右子树中序遍历:左子树,跟结点,右子树;跟结点的值.二叉查找树插入,根节点为空就有新元素作为根节点,否则,传入的参数和根节点进行比较;value等于当前节点就返回,如果当前节点存在左孩子,就继续调用插入的方法,如果不存在,就把新的元素插入到当前节点的左孩子部分;二叉排序树的局限性:如果把下面的一行数字插入为排序树:[1, 2, 3, 4, 5]这个时候二叉排序树就会退化成链表,退化成链表后,查找数字的时间复杂度变为了O(n),空间
2020-07-23 18:53:49
156
原创 查找算法:二分查找(1,0)问题模型(0,1)问题模型、三分查找
查找是指在数据集合中寻找满足某种条件的数据元素的过程,用于查找的数据集合则成为查找表,查找表中的数据元素类型是一致的,并且有能够唯一标识出元素的关键字。如果从查找表找出了关键字等于某一个给定值的数据元素,则称为查找成功,否则称查找不成功。静态查找表:对查找表只进行(查找和检索)静态查找表建立之后,不能再执行插入或者是删除的操作,查找表页不再发生变化。对应的,如果对查找表还需要执行两种操作,那么这类查找表就是动态查找表。针对静态查找表,比如顺序查找、折半查找、分块查找等,动态查找表:(查找、检索、插入
2020-07-05 10:59:36
482
原创 堆和优先队列
一、大顶堆和小顶堆大顶堆:每一个结点:(当前结点> max (左结点、右结点)小顶堆:每一个结点:(当前结点 < min (左结点、右结点)由定义的出来,大顶堆的最大值一定是在跟结点,次最大值是在第二层,其余的大小不能判定;同理可以得到,小顶堆的最小值一定是在跟结点。二、大顶堆的相关操作定义typedef struct heap { int *data; int size; int cnt;} heap;data用于存放连续区域的数字,size表示最多能
2020-07-04 16:36:16
283
原创 图的存储方法的选择
稠密表和稀疏表的存储方式稀疏表邻接表来存储,如果用邻接矩阵存储,就存下来太多的0,浪费了空间稠密表邻接矩阵来存储,可以充分利用空间,邻接表来存储,这个操作会增加很高的负复杂度。有向图:邻接矩阵不一定对称有向图图中的边是单边的,如果用邻接矩阵来存储,邻接矩阵不一定是对称的。无向图:邻接矩阵一定是对称的因为无向图中的边是双边的查询两个顶点之间是否有边,邻接表比邻接矩阵更加的方便,如果用邻接表就要在链表中逐个查找。相比之下,邻接矩阵比邻接表更加滴方便。...
2020-07-04 11:12:13
184
原创 C语言工程开发的基础知识(makefile)
一、定义和声明#include "set.h"区别 于#include <set.cc>(.h)头文件和(.cc)源文件,分开放函数的定义和声明变量的函数定义和声明在test.c中有这样两个语句(1.#include "set.h")区别 于(2.#include <set.h>)在对test.c编译的过程中< >从系统目录开始寻找set.h,在gcc编译时候可以使用gcc -I./ (文件名)" "则是从当前文件夹中开始找set.h所有
2020-06-20 18:39:44
186
原创 函数的声明和定义的区别(一)
函数的声明和编译:声明是给出函数返回类型,传入参数类型,不必进行具体的固定流程void funcA(int);定义则是具体的#include<stdio.h>void funcA(int n) { if(n == 0) return ; printf("funcA = %d\n", n ); funcA(n - 1);}int main() { funcA(5); return 0;}像这样写,函数的定义过程就完成了没有什么问题,编译后输出如下fu
2020-06-17 11:18:11
2231
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人