目录

  • 一、什么是Linux?什么是操作系统?
  • 二、为啥要学习linux?什么是linux命令?
  • 三、linux的基本指令
    • 1、ls命令
    • 2、cd命令
    • 3、文件夹命令
    • 4、删除命令
    • 5、拷贝命令
    • 6、移动文件命令
    • 7、压缩文件/文件夹的命令
    • 8、查看大文件内容的命令
    • 9、操作文件的命令
    • 10、切换用户的命令
    • 11、man查看函数和命令介绍
  • 四、命令行解释器(shell)
    • 1、解释命令行解释器
  • 五、权限
    • 1、权限的种类
    • 2、权限的对象:用户、用户组、其他用户
    • 3、更改权限
  • 六、编辑器和编译器工具(vim、gcc/g++)
    • 1、编辑器vim的快捷键
    • 2、命令行模式下的指令
    • 3、编译器(gcc/g++)
    • 4、在debug版本下调试程序的两种方法
    • 4.1什么是debug版本?
    • 4.2debug版本怎么生成?
    • 4.3两种调试方法(调试可执行程序、调试coredump文件)
    • 4.3.1调试可执行程序
    • 4.3.2调试coredump文件
    • 4、通过make(自动化解释器)解释makefile(文件)进而生成可执行程序
  • 七、进程
    • 1、什么是进程?进程和程序之间的关系是什么?
    • 1.1如何查看进程信息?
    • 1.2如何查看具体某个进程信息?
    • 2、进程在哪里被管理?进程的格式是怎么被描述的?
    • 2.1进程在操作系统中的描述格式(PCB):
    • 2.1.1什么是进程标识符(PID)?如何查看PID?
    • 2.1.2进程状态
    • 2.1.3什么是程序计数器?什么是上下文信息?
    • 2.1.5 内存指针
    • 2.1.6 记账信息
    • 2.1.7 IO信息
    • 3、什么是父进程什么是子进程?
    • eg:父子进程具有相同的代码段执行的事件是一样的吗?
    • 3.2如何创建子进程?
    • 3.1如何查看父子进程id号?
    • 3.2.1如何区分子进程和父进程?
    • 4、什么是僵尸进程?僵尸进程是怎么产生的?
    • 4.1 如何结束僵尸进程?
    • 5、什么是孤儿进程?
    • 4、什么是环境变量?
    • 4.2 怎么查看环境变量?
    • 4.3 常见的环境变量都有那些?
    • 4.4 怎么设置环境变量?
    • 4.4.1 设置临时生效的环境变量(只在当前的终端中生效):
    • 4.4.2设置永久生效的环境变量(在新的终端中直接从文件夹中读取内容)
    • 4.4.3怎么在代码中获取环境变量?
    • 1.将argc(命令行个数)和argv[](参数包含内容指针数组)设为函数参数获取环境变量
    • 2、设置env参数获取环境变量
    • 3、通过environ参数获取环境变量(配合extren关键字使用)
    • 5、什么是进程的虚拟地址空间?进程是如何通过虚拟地址空间找到实际地址空间的?
    • 5.1页表的分页式,分段式,段页式储存映射虚拟地址与物理地址
    • 什么是进程优先级?
    • 如何查看进程的优先级信息?如何修改优先级?
  • 八、如何实现对进程进行控制?
    • 1、如何实现进程创建?
    • 通过fork()函数创建进程
    • fork函数创建失败的几种情况
    • 2、如何实现进程终止?
    • 2.1终止进程的方法
    • 1、从main函数中return返回
    • 2、使用exit函数
    • exit函数和_exit函数的不同点
    • 2.2什么是缓冲区?\n和缓冲区有什么关系?
    • 2.3如何查看函数退出时返回的参数?
    • 3、执行用户自定义的清理函数
    • 4、什么是进程等待?如何实现进程等待?
    • 4.1wait函数
    • 4.2什么是阻塞状态?怎么查看阻塞状态下进程在处理的事情?
    • 4.3waitpid函数
    • 5、什么是进程替换?如何实现进程替换?
    • 6、什么是minishell?
  • 九、Linux中的基础IO是什么意思?
    • 1、c语言的文件操作接口(都是库函数)
    • 2、系统调用文件接口
    • 3、什么是文件描述符&文件流指针?
    • 文件描述符
    • 怎么查看进程最大可以打开多少个文件描述符
    • 文件流指针是什么?与文件描述符有什么联系与不同?
    • 4、怎么查询linux的内核版本?
    • 5、重定向
    • 6、静态库和动态库
    • 7、文件系统
    • 8、软硬连接

一、什么是Linux?什么是操作系统?

在初学Linux的时候我们都知道Linux是一个操作系统,那么操作系统是什么呢?
首先让我们再回顾一下冯诺依曼体系结构:

1、冯诺依曼体系五大部件结构

出于对效率提升的需求,如果外设和内存直接联系的话,当外设在接收文件时cpu就一直处于等待的状态,这大大降低了计算机处理数据的效率,所以外设和cpu不可以直接联系,而是通过中间的内存对双方的数据进行储存,进而达到数据的传输。
用聊天时的数据流向来看整个过程:

2、那么冯诺依曼结构这和操作系统又有什么关系呢?
首先让我们弄清楚操作系统是干什么的,操作系统是对计算机软硬件进行管理的软件,而冯诺依曼结构奠定的是是现代计算机的硬件结构。
所以操作系统就是对冯诺依曼中提到的硬件和计算机中的软件进行管理的软件。
没错,归根结底操作系统也是一款软件。
想想你是怎么使用一款软件的,这款软件和那些软件也是一样的,不过是一款管理软件的软件而已。
操作系统的结构:

操作系统具体怎么操作软硬件我们后面再细讲。
3、了解了什么是操作系统,那我们再来说说windox操作系统和Linux操作系统又有什么不同为什么我们学习的不是windox操作系统而是linux操作系统呢?
让我们看看两者的对比:

注意:

二、为啥要学习linux?什么是linux命令?

为啥要学习linux?
linux几乎是现在互联网公司的后台程序开发系统,windows操作系统更多的对应的是pc端的使用。为啥要学习linux可以说是不言而喻了。
什么是linux命令?
在linux中所学习的所有命令自己本身也是程序,对应到Windows操作系统当中相当于一个个.exe的程序,各种命令行参数相当于程序里不同的函数,这样一来对命令的理解是不是就贴切多了,只是在另一个操作系统中使用原来已有的程序而已。
在linux操作系统中命令执行之后的现象也是有很多种的,一些命令在运行完成之后就结束了,而一些命令执行之后回陷入类似等待的状态,此时使用ctrl + c结束进程即可。

三、linux的基本指令

1、ls命令

ls:罗列文件夹下的文件以及文件夹
pwd 查看当前文件夹或者文件的路径
ls -a:显示隐藏文件增加的,-a是命令行参数
ls -l 显示文件或文件夹的详细信息(简写ll)

ls -lrt 安时间对文件夹和文件进行排序
ls / 罗列根目录之下所有的文件夹

2、cd命令

cd :切换目录进入文件夹
cd /:cd到根目录下
cd ~: cd到当前用户的家目录下
cd -:回到上一个文件夹上
cd …:回到上级目录
cd /[tab]:命令补全,补全文件的路径

3、文件夹命令

mkdir[文件夹名称] :创建文件夹
touch[文件名称]:创建文件

4、删除命令

rm:删除文件
rm -r:删除文件夹
rm -rf /:从根目录之下开始删除
rm -i :对删除内容进行一步一步的提示删除

5、拷贝命令

cp [待拷贝 的文件] 拷贝到的[path]:拷贝文件
cp -r [待拷贝的文件夹] 拷贝到的[path]:拷贝文件夹
cp [拷贝文件]拷贝到的 [path]/文件重命名的[名称]:拷贝文件之后进行重命名
cat 查看文件内容

6、移动文件命令

mv [文件夹/文件路径] 移动到.(当前目录下)/~(家目录下)/想移动到的路径:移动文件/文件夹
mv[原名称]替换成[新的名称]:文件/文件夹的重命名

7、压缩文件/文件夹的命令

zip压缩
zip [压缩文件之后的名称].zip[待压缩的文件]加:压缩文件
zip -r [压缩文件夹之后的名称].zip[待压缩的文件夹]加 :压缩文件夹(-r递归压缩文件夹下的文件)
unzip [待解压的文件和文件夹名称] :解压缩
tar压缩(包含两种压缩)
gzip压缩:
tar -zcvf [压缩后的名称].tar.gz[待压缩的文件或者文件夹]:压缩文件
tar -zxcf [待解压缩的文件].tar.gz:解压文件
bzip2压缩:
tar -jcvf [压缩完成文件的名称].tar.bz2[待压缩的文件]:压缩文件
tar -jxcf [解压缩的文件].tar.bz2:解压缩文件

8、查看大文件内容的命令

more [文件名称] :查看文件内容,b向前翻页,f向后翻页
less[文件内容]:查看文件内容,b向前翻页,f向后翻页,两个命令采用的都是预加载的方式对大文件进行显示
head[文件名称]:查看文件头部内容,默认十行内容
head -n[num]加[文件名称]:查看文件头部的num行的内容
tail [文件名称]:查看文件尾部的内容
tail -f [ filename]:检测文件是否有变化,若有变化直接将变化显示到当前界面中
ctrl+c:1、中断当前的命令输入,2、结束正在执行的前台进程

9、操作文件的命令

cat[文件名]:查看文件内容
echo[字符串]>[文件名称]:往文件中写入内容
find[path]-name[文件名称]:查找文件所在的路径
grep[要查找的字符串]-R[path]:1、查找文件中的字符串,2、配合管道符号过滤其他命令的输出结果:

date :查看当前时间

tree:查看目录结构,显示文件夹的层次结构

histroy:查看历史执行过的命令
快捷执行之前执行的命令:
1、![之前执行过的命令的头部内容]
2、![命令]:快捷执行之前执行过的命令
3、使用键盘向上键寻找之前使用过的命令
//table快速补全命令行

10、切换用户的命令

su -root:从普通用户切换到root用户
exit: 回到普通用户
su [用户名称]:普通用户间相互切换

11、man查看函数和命令介绍

man手册的安装命令(注意要在root用户下安装)

#安装man
yum install -y man
#安装man-page
yum install -y man-pages

main 1 [命令名称]:查看命令介绍
main 2 [系统函数名]:查看系统函数的介绍
main 3 [库函数的名称]:查看库函数的介绍

四、命令行解释器(shell)

1、解释命令行解释器

上文所列出的各种操作命令是如何具体实施完成操作的呢?

此处的/bin/bash就是命令行解释器,上述的所有命令都是提交到命令行解释器,再命令行解释器传递到操作系统内核。也就是说命令行解释器只是一个中间的接口。

五、权限

1、权限的种类

-r 可读权限
-w 可写权限
-x可执行权限

2、权限的对象:用户、用户组、其他用户

权限有三个操作对象,分别是当前用户(u),当前用户组(g)和其他用户(o),在一个操作系统下有着多个用户组,每个用户组下有着不同的用户,彼此互为其他用户,即单个用户(家目录)和它所在的用户组以及其他用户,就是权限的操作对象。
一个文件或者文件夹,针对当前文件/文件夹所属的用户,当前文件/文件夹所属的用户组,当前文件/文件夹对应其他用户三个对象就要设置三个权限。

3、更改权限

三个对象对应都有三个权限,分别是可读、可写、可执行,顺序不变对应填写r w x如果该对象没有某个权限就填写 -
针对当前所属用户:r w x
针对当前所属用户组:r w x
针对其他用户:r w x
更改命令权限:
1、chmod (用户标识符)+/- (权限) [文件名称]
原本的权限:

更改后的权限:

2、chmod (权限数字) [文件名称]
将权限对应位置看作二进制数字,若1为具有权限,0就没有权限
例如我们现在再将hello这个文件的用户权限改成可读可写:

得到权限数字664

这样就又更改权限为可读可写了。

六、编辑器和编译器工具(vim、gcc/g++)

1、编辑器vim的快捷键

1、移(在NOEMAL模式下光标的移动):
j:下,k:上,h:左,l:右,
w:切换到下一个词的词首,b:切到上一个词所在的词首,

2、删除
dd:剪切当前行的内容,p:粘贴剪切内容到光标所在的下一行,[num]dd:删除num行,
x/[num]x:删除光标所在位置的一/num个字符,X/[num]X:删除光标所在的前一/num个字符,

3、复制
yy/[num]yy:复制一/num行,p:将内容复制到光标所在的下一行,P:将内容粘贴到光标所在的上一行

4、替换
r:替换光标所在的字符,R:进入到替换模式可以替换多个字符。

5、撤销
u:撤销,ctrl+r:返撤销,

6、更改
c:删除光标后面的所有元素,并自动切到INSERT模式。
cw:删除光标所在的单词,并自动切到INSERT模式。

7、跳转
gg:跳转到文件的头部,G/shift+g:跳转到文件的尾部,[num]G:跳转到文件的任意一行,ctrl+o:跳转到上一次的位置, gg=G/shift+g:缩进模式,
I:光标回到当前行的行首,A:光标跳到行尾位置,
o:从光标的下一行开始插入,O:从光标的上一行开始插入。
多行注释:
ctrl+v:进入可视模式 j/k选中行,I+//:输入注释符,esc:执行命令
多行删除:
ctrl+v:进入可视模式 j/k选中行,x:执行命令,

2、命令行模式下的指令

分屏打开文件:
:vs[文件名称]
:ctrl+ww:在分屏中跳转
替换字符串:
:s/代替换的字符串/替换的字符串/g:单个替换
:s/代替换的字符串/替换的字符串/g:全部替换
:/[搜索的字符串]:查找某个字符串+n找下一个匹配的字符串

3、编译器(gcc/g++)

程序的四个编译过程:预处理、编译、汇编、链接,gcc编译器用来编译c语言,g++编译器编译c/c++ 。
查看源码:

1、预处理
命令:gcc -E [程序名称] -o [编译后文件的名称]

2、编译(对语法语义进行检测,并且生成汇编代码)
命令:gcc -S [程序名称] -o [编译后文件的名称]

3、汇编
命令:gcc -c [程序名称] -o [编译后文件的名称]

4、链接
将目标程序和库链接在一起生成目标程序
命令:gcc [程序名称] -o [编译后文件的名称]

绿色的就是可执行的文件

4、在debug版本下调试程序的两种方法

4.1什么是debug版本?

程序在我们编写时时debug版本,在这个版本之下对程序进行调试修改,修改完毕之后发布给客户的是不具备修改权限的release版本。

4.2debug版本怎么生成?

命令:gcc [程序名称] -o [编译后的文件名称] -g

4.3两种调试方法(调试可执行程序、调试coredump文件)

4.3.1调试可执行程序

命令:gdb [可执行文件名称]
1、查看源代码: l

2、打断点:b [行号]

3、删除断点:delete[断点序号]

4、查看断点信息:i b

5、disable [断点序号]:使断点失效

6、enable[断点序号]:使断点生效

7、r: 启动程序

8、s:逐语句执行

9、n:逐过程执行

10、c:继续执行

11、p [变量名]:打印变量信息

12、q:退出命令

4.3.2调试coredump文件

coredump文件是啥?
程序崩溃之后产生的内存镜像文件,文件里保存的是文件崩溃瞬间文件里的内容,它的存在让我们在程序崩溃之后还能对程序进行更改修正。
怎样产生coredump文件
1、更改core file size值为无限。
ulimit -a :查看所有镜像文件的大小

ulimit -c: 单独查看内存镜像文件的大小
2、ulimit -c unlimited
设置内存镜像文件大小为无限。

3、保证磁盘空间足够。
4、怎么调试coredump文件?
1、gdb[可执行程序]+[coredump文件]:打开gdb调试界面

2、bt:查看调用堆栈(堆栈从下往上看,最终因此程序奔溃的堆栈在顶层)
3、f [堆栈序号]:跳转到某个具体堆栈

4、通过make(自动化解释器)解释makefile(文件)进而生成可执行程序

在没有构造解释器之前,生成一个可执行文件需要一步步完成,而解释器就是对这些步骤的封装。

makefile文件如何生成?
1、make一个makefile文件,
2、makefile文件内容格式:
3、make命令执行makefile文件

解释makefile的生成原则
1、make解释器在执行之前会对目标对象和依赖对象的时间进行比较,判断目标对象是否需要重新执行。
2、生命周期:第一个目标对象生成之后结束工作
3、若一次有多个可执行程序怎么在makefile文件中定义?
命令:all[目标文件名…]

makefile中的预定义变量(简化makefile的编写
$^:依赖对象 $@:目标对象

makefile中定义删除目标文件
命令:clean:rm[目标对象]

使用过程:

makefile文件中的自定义变量文件
怎么使用自定义变量?

七、进程

1、什么是进程?进程和程序之间的关系是什么?

程序是指源代码经过编译之后的静态可执行文件,
进程就是进行中的程序,即程序运行时的实例对象,是动态的,
我们也可以这么理解,静态的程序从内核分配到资源之后,开始运行变成了动态的进程。

1.1如何查看进程信息?

命令: ps aux

1.2如何查看具体某个进程信息?

通过管道查看,命令:ps aux | grep[./程序名称]

2、进程在哪里被管理?进程的格式是怎么被描述的?

操作系统使用描述加组织的方式管理进程,并使用进程控制块(PCB)描述进程
ed:怎么打开多个终端?(在后续对运行中的进程进行观察时需要使用到)
1.ctrl+alt+t:打开一个终端。
2. ctrl+shift+t :在当前终端中新建终端
3.Alt+n:切换到第n个终端

2.1进程在操作系统中的描述格式(PCB):

2.1.1什么是进程标识符(PID)?如何查看PID?

是某个进程相关的唯一标识符,用来区别其他进程。
ps aux | grep [程序名称]

2.1.2进程状态

并行:多个进程在同一个时刻,拥有不同的CPU进行运算称之为并行,
并发:多个进程在同一时刻只能有一个进程拥有CPU进行运算称之为并发,
R:运行状态
S:可中断睡眠状态
D:不可中断睡眠状态
T:暂停状态(ctrl+z)使进程暂停,并不是退出运行,(fg)结束暂停
t:跟踪状态,在gdb调试的时候出现,
X:死亡状态
Z:僵尸状态

2.1.3什么是程序计数器?什么是上下文信息?

CPU是有限的,而进程是无限的,每个进程不一定操作结束才被切出,在操作过程中也存在着被切出的现象,程序计数器对进程在操作过程中被中断时的指令进行保存,上下文信息对指令需要的数据进行保存,以确保下次进程重新回到操作系统时依旧能够接着此前的指令进行,

2.1.5 内存指针

内存指针指向程序的地址空间。

2.1.6 记账信息

记录cpu使用时长,占用内存大小等信息,

2.1.7 IO信息

IO信息中保存着当前进程打开文件的信息,
/proc文件夹:以文件夹的形式保存着当前操作系统所维护的所有进程的信息(IO信息)

3、什么是父进程什么是子进程?

子进程的PCB完全拷贝来自父进程,内存指针指向同一个地址空间,所有的代码段也是完全一样的,

eg:父子进程具有相同的代码段执行的事件是一样的吗?

是不一样的,父子进程在执行了fork函数之后会有不同的返回值,不同的返回值执行的程序是不同的,即可以理解为划分父子进程不同的区分点。
-1:创建失败

0的返回值:创建成功(返回给父进程)
==0的返回值:创建成功(返回给子进程)

3.2如何创建子进程?

在父进程中使用fork函数创建子进程。
pid_t fork(void):创建子进程

3.1如何查看父子进程id号?

pid_t getpid(void):获取当前进程的pid号,谁调用获取谁。
pid_t getppid(void):获取当前父进程的pid号,谁调用获取谁的父进程pid号。

3.2.1如何区分子进程和父进程?

命令:ps -ef | grep [进程名称] :展示输出父进程和子进程的id号

4、什么是僵尸进程?僵尸进程是怎么产生的?

僵尸进程是指在一个进程结束之后,本该被操作系统释放的结构体没有被释放,依然存在,进而造成内存泄漏现象的进程
当子进程先于父进程退出时,子进程通过信号通知父进程前来回收资源,但是父进程没有回收子进程的资源,从而导致子进程的PCB得不到释放,变成了僵尸进程

4.1 如何结束僵尸进程?

在此之前我们会使用kill命令杀死进程:kill[pid] / kill -9 [pid] 但是该命令只对“活”进程有用,由于僵尸进程已经造成内存泄漏所以是不可以被该命令杀死的。一下几种结束僵尸进程的方法:
1、重启操作系统
2、kill僵尸进程的父进程
3、进程等待:父进程通过等待的方式,回收子进程的资源,获取子进程退出的信息。
函数:
pid_t wait(int*status);
成功返回进程pid 失败则返回-1

pid_ t waitpid(pid_t pid,int *status,int options):
成功返回子进程进程id,

5、什么是孤儿进程?

当父进程先于子进程退出时,由于父进程退出,资源无法被回收的子进程被1号进程“领养”回收资源,否则会变成僵尸进程,像这样的进程就叫做孤儿进程。

4、什么是环境变量?

环境变量是指指定操作系统运行环境的参数。环境变量指定参数,让bash能够在操作系统使用命令运行时,通过指定的参数找到能够使命令运行的文件。
当环境变量没有指定参数:

常用的ls ll 等命令都是环境变量指定的参数。

4.2 怎么查看环境变量?

1、echo $[环境变量名称]

2、env:以键值对的方式储存

4.3 常见的环境变量都有那些?

1、PATH:保存着所有可执行程序的搜索路径
当程序中使用例如ls,ll等命令时,bash会在PATH中包含的所有路径中逐个查找已保存可执行程序的文件,找到命令要求的文件夹对应执行动作。

2、SHELL:保存命令行解释器名称

3、HOME:保存当前用户的家目录

4.4 怎么设置环境变量?

4.4.1 设置临时生效的环境变量(只在当前的终端中生效):

export[环境变量名称]=$【环境变量名】:【新增加的路径】

4.4.2设置永久生效的环境变量(在新的终端中直接从文件夹中读取内容)

1、 ~/.bashrc
2、 ~/.bash_profile
vim ~/.bash_profile:进入文件夹
export:[环境变量文件名称] =$[环境变量文件名称]

Linux知识从无到有(持续更新)相关推荐

  1. pwn学习总结(四)—— 堆基础知识(持续更新)

    pwn学习总结(四)-- 堆基础知识(持续更新) 前言 chunk 使用中(分配后) 空闲中(释放后) 堆块大小 空间复用 bins fastbin unsorted bin small bin 前言 ...

  2. pwn学习总结(二) —— 基础知识(持续更新)

    pwn学习总结(二) -- 基础知识(持续更新) Canary PLT表&GOT表 格式化字符串漏洞 GCC编译参数 ASLR 危险函数 输入流 syscall条件 shellcode 其它 ...

  3. 关于keil的一些基础知识(持续更新)

    #关于keil的一些基础知识(持续更新) 1.数据类型转换 (1)写程序的时候需要将一个32位16进制数值转换到10进制显示在TF屏上,由于基础比较烂,一直没有想明白,写了各种复杂的类型转换.. 代码 ...

  4. [GCN] 图卷积知识梳理 -持续更新

    图卷积知识梳理 文章目录 图卷积知识梳理 1. 为什么 Graph Laplacian L=D−AL=D-AL=D−A --差分的方式理解 2. 为什么是 Graph Laplacian LLL -- ...

  5. Java工程师进阶知识(持续更新)

    生生不息,"折腾"不止:Java晋升指北,让天下没有难学的技术:视频教程资源共享,学习不难,坚持不难,坚持学习很难: >>>> 文章内容大部分来自小编的学习 ...

  6. Java面试知识(持续更新)

    (欢迎各位大佬添加新的面试知识,本文纯属博主手打,如有错误,欢迎各位大佬批评在下方,小弟一定及时改正) 基础篇 1.一个".java"源文件可以有多个类,但只能有一个public类 ...

  7. Linux命令(持续更新)

    1. tail 命令 tail  -f  filename 会把 filename 文件里的最尾部的内容显示在屏幕上(默认10行,相当于增加参数 -n 10),并且不断刷新,只要 filename 更 ...

  8. [Linux] Linux指令汇总(持续更新中...)

    写在前面: 以前真心没有玩过Linux系统,总感觉整天摆弄Linux的同学都是大牛.如今,在公司里实习需要远程登录Linux服务器,所有的代码都要在开发板上完成,所以被逼无奈也不得不定下心来好好学学L ...

  9. 高逼格又实用的Linux命令:持续更新中

    摘要: 高逼格又实用的 Linux 高级命令,开发运维都要懂 新年伊始,回顾自己的运维生涯,打交道最多的还是Linux系统,但凡使用Linux系统就免不了敲命令,所以想总结一下关于Linux非常高逼格 ...

最新文章

  1. 端口扫描程序nmap使用详解
  2. docker安装PostgreSQL
  3. 打开深蓝医生的国庆大礼包!
  4. Java经典面试题:一个线程两次调用start()方法会出现什么情况?
  5. TF之DNN:利用DNN【784→500→10】对MNIST手写数字图片识别数据集(TF自带函数下载)预测(98%)+案例理解DNN过程
  6. linux最基础安装,Linux Nginx最基础的十大安装步骤(2)
  7. CC框架实践(1):实现登录成功再进入目标界面功能
  8. 计算机组成原理——Cache与主存的地址映射
  9. 微课|中学生可以这样学Python(例5.6、例5.7):集合应用
  10. Okhttp 向服务器发送请求(请求头,表单,post json数据)...
  11. 分享免费下载论文的网站
  12. Redo和Undo的区别
  13. 怎样修复计算机系统软件,重装系统后软件如何恢复呢?
  14. 使用Python套接字编程的视频聊天应用
  15. 手把手教你软件著作权申请表填写
  16. 微信的账号连接服务器失败怎么回事,微信无法连接到服务器的原因和6个解决方法...
  17. 能上QQ但不能上网问题精解
  18. KingbaseES人大金仓学习
  19. 快手扫码登录【2021-12-03】
  20. 知到网课职业生涯规划考试试题和真题题库(含答案)

热门文章

  1. 理论力学---虚功原理
  2. AutoCAD入门基本操作
  3. 所有类的父类 Java Object
  4. 8145v5 参数_【DCM-07】Random Parameter(随机参数)Logit模型及其Nlogit实现
  5. Winsoft OBR库v2.2-10.3-SEO-狼术
  6. ARM:ELF bin Hex axf
  7. 苹果手机信号是哪个服务器,苹果12系列手机基带是哪个?信号怎么样?
  8. python爬虫之使用requests进行图片爬取
  9. transformer机制讲解_从发展历史视角解析Transformer:从全连接CNN到Transformer
  10. 基于STM32单片机的智能水表水流量计原理图PCB