-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlinux学习
472 lines (249 loc) · 15.9 KB
/
linux学习
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
gdb调试:
gcc a.c b.c c.c -g -o app
-g:会保留函数名和变量名。 这样才能进行gdb调试
gdb app (进入app的gdb调试环境)
给程序传参: set args xxx xxx (argv[0]就是可执行程序的名字(绝对路径))
l(list): 显示main所在文件的内容
set listsize xxx. 设置显示的行数
当前文件:
l 行号; l 函数名
非当前文件
l 文件名:行号(显示行号的上下文,不仅仅是单个行的命令)
l 文件名:函数名(因为好几个文件共同形成一个 “app”文件)
b 行号: 加断点
info(i) b: 查看设置过的断点
d(del) 1(删除断点编号): 这个编号是设置断点时系统给他赋的值
d 4-7 :删除范围断点
dis(disable) 8(将8号断点无效化)
enb 8
条件断点: 满足某一条件时(在循环中),断点生效
b 17 if i==10
p(print) i :打印i的值
ptype i :输出i的数据类型
display i: 这样在后面用n运行程序的时候,每一次都会把i打印出来(一般用在循环中)
undisplay 1(编号)
c(continue): 继续走,走多步。走到下一个断点处
r(run) 会在断点处停下,且显示这个断点所在行的代码
n(next) 向下走一步。 遇到函数不会进入函数体
step: 也是单步调试,会进入的函数内部
finish: 从函数体内出来,回到主函数中。(出来的位置为函数在主函数中所处位置的下一行)
如果出不去,看一下函数体中的循环中是否又断点,如果有删掉,或者设置无效
start: 停在开始的位置(main函数下面一行)。已经跑起来了,所以后面跟c(continue)
q: 退出gdb环境
until :从循环体中直接跳出,不能有断点
//******
直接设置变量等于某一个值:
set var 变量名 = value
# gcc badptr.c
# ./a.out
查看文件信息: cat t.txt | tail 10
查看linux版本号:
1.输入 uname -a 显示电脑以及操作系统的相关信息
2.输入 cat/proc/version 说明正在运行的内核版本
3.输入 cat/etc/issue 显示的是发行版本信息
4.lsb_release -a 查看信息
<1> mpstat: mpstat 不但能查看所有CPU的平均信息,还能查看指定CPU的信息。
<2> vmstat:只能查看所有CPU的平均信息;查看cpu队列信息;
<3> iostat: 只能查看所有CPU的平均信息。
<4> sar: 与mpstat 一样,不但能查看CPU的平均信息,还能查看指定CPU的信息。
<5> top:显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示。
1. ls命令:显示当前路径下的文件
ls 2*:表示显示2开头的文件。 *为通配符
ls 2?:显示类似于23的文件; ls 2??:显示类似于234的文件
ls 1[x-z]3:显示1x3、1y3、1z3文件: 正则表达式
2. pwd命令:显示刚刚所处路径
3. cd命令: 切换目录/路径
4. touch 文件名:touch空格 创建文件。 如果创建的文件名开头是“.”,则把该文件当做隐藏文件
5. mkdir 文件夹名:创建文件夹
6. clear清屏命令
7. 命令 -选项 参数 例如:ls /bin /是根目录 /bin意味着是根目录下的文件夹bin /bin是参数
8. ls -a :显示隐藏文件。
ls -l:以列表的方式显示,程序显示的内容一行一行的
ls -h:转换文件大小显示格式,需要与其他选项共用才有效,-lh, 单独使用无效
选项的顺序无所谓,且可以合并。 ls -alh
9. ls --help:调出帮助文档
10.man 要查询的命令:例如 man ls。 man==manual
11.cat 要查询的文件:查看文件里。/面的内容
cat 1.txt 2.txt > xx.txt :把两 个文件中的内容合并起来放在新的文件中
12.tab键是自动补充文件名
14.rm -r 文件名/文件夹名:删除 全部删除,可以删除包含内容的文件夹, -r的意思是递归
rm / -rf 文件全部删除
15.ls > xxx.txt :把原本显示在终端屏幕上的内容放到文件里面去,重定向,会覆盖文件里面的内容。若当前路径下无xxx.txt文件,则创建。
ls >> xxx.txt:追加,在原文件末尾加上内容。
16. more xxx.txt:F往下翻,B往上翻。 显示文件内容,但不会一次显示完全
17.ls -alh /bin | more :把内容放到|内,然后通过more显示。 不会创建xxx.txt临时文件
18.相对路径、绝对路径: 相:从当前位置开始的路径。 绝:从根目录开始的路径
19. cd /home/python/按两次tab键 显示当前路径下的所有能够到达的路径
20. cd -:返回上一次的路径位置。 cd ~ :回到家目录
21. mkdir /a/b/c/d/e -p: -p会自动创建文件夹(abcd。。这些文件夹)。
22. tree : 会把文件夹当成树来显示
23. rmdir 文件夹名:删除当前路径下同名文件夹。 但不能删除非空文件夹
24. 软硬连接:类似于window的快捷方式。 ln
软连接:ln -s 1.txt 1-softlink.txt :1-softlink为1.txt的快捷方式
硬链接:ln 1.txt 1-hardlink.txt: 复制
25. mv 原文件名 新文件名:重命名
26. grep -nv “xyzws” xxx.txt: 在xxx.txt文件中搜索包含“”中内容的所有文件, -n表示文件在哪一行 -v表示不包含。
在“”中加入^,如“^1234” 表示查找以1234为开头的文件
在“”尾加入$,如“1234$”表示查找以1234为尾的文件
27. cp 2.txt A -r 把2.txt复制并粘贴到A文件夹内
mv 2.txt A/ 把2.txt剪切(移动)并粘贴到A文件夹内
28. ./ 当前目录
.代表的是相对路径的当前目录,如果需要全路径则为/root/docker_demo
29. sudo find / -name “*name*” :在根目录中查找有name名字的文件
32. tar -zcvf test.tar.gz *.py ,tar -zxvf test.tar.gz -C xxx/ (解压到指定路径):压缩和解压
tar -jcvf test.tar.bz2 *.py,tar -jxvf test.tar.bz2
33. ps -aux:相当于windows中的任务管理器,查看当前运行状况
top: htop:一样的效果,有排序
34. kill -9 PID: 关闭进程,-9是强制关闭
35. sudo useradd 名字 -m :添加新用户,在home文件夹中创建了该名字的文件夹
37. sudo password 名字(用户名字):更新/输入密码
输入的密码不会显示
36. su - 账户名字 :切换用户,或者叫登录新用户。同时用户的路径也发生了改变,不再是之前一个用户的路径
exit:退出当前账户
38. ssh:远程连接。 ssh [email protected]。 远程登录 windows不能通过这种方式连接linux,它没ssh命令。 通过charmanger软件连接
39. ifconfig :查看当前系统网络
40:ctrl+shift+t: 增开新的标签,类似于浏览器
41:sudo userdel -r 名字:删除用户,以及删除用户的家目录
42: sudo -s:进入超级管理员
43:$普通用户 #超级管理员
44:cat /etc/group 查看拥有的组; cat /etc/password 查看所有的用户
45:groupadd 组名:创建新的组
46:groupmod 两下tab键:查看所有组的组名
47: 新创建用户默认不能sudo,需要进行:
sudo usermod -a -G amd 用户名
sudo usermod -a -G sudo 用户名
48:gedit 文件名: 打开文件
gedit编辑器
vim编辑器
49:vim 文件名:新建并打开文件。 默认模式是命令模式:即类似于命令行。
输入i或a或o或I或A,更改为编辑模式,即可以更改文件中的内容,
i在插入点前插入,a在插入点后插入,o在其下一行插入,I:行首,A:行尾,O:上一行
输入esc按键,回到命令模式
输入一个冒号":":命令模式进入末行模式,在末行中输入wq:保存并退出文件。
:%s/hello/word/g:用word替换hello(全部)
:num1,num2s/abc/123/g:在num1到num2行中用123替换abc
直接按/,在末行中/hello :搜索hello 。
vim中,命令num yy是复制从光标所在的这一行开始的num行,p是粘贴,dd:剪切光标所在行
h左 j下 k上 l右
ctrl+f:向下翻一页
ctrl+b:向上翻一页
D:从当前的光标开始剪切,一直到行末
u:撤销刚刚的操作 。 ctrl+r:反撤销 d0:从当前的光标开始剪切,一直到行首
x:删除当前光标,每次只删除一个
r:替换一个字符
R:替换光标以及后面的字符
w:保存
q:退出
wq:保存退出
shift+zz == wq
q!:不保存退出
ll命令:ll会列出该文件下的所有文件信息
ll -t 是降序, ll -t | tac 是升序 按创建(修改)时间的先后顺序排序
ll不是命令,是ls -l的别名。ls 只列出文件名或目录名
ls -Sl 按文件大小由大到小排序
ls -Slr 由小到大排序
ls -Slr | head -5 取前五行,即前4个文件 (tail则为后5个文件) |是管道
top、htop 查看cpu占用
netstat、ifconfig 查看网络
df 查看文件系统的磁盘占用
free 查看内存使用
创建文件时,文件默认权限是666:rw-rw-rw-,目录默认权限是777:rwxrwxrwx。 减去umask:默认0002,就是相应的真实权限
r:可读 w:可写 x:可执行
linux没运行一个程序(进程),操作系统都会为其分配1个0~4G的虚拟地址空间
内核区:内核空间是受保护的,用户不能对其进行读写操作,否则会出现段错误
内核区:内存管理、进程管理、设备驱动管理、vfs虚拟文件系统
fork创建子进程(开辟新空间,复制父进程): 读时共享(共享资源),写时复制。
7种文件类型:
1.普通文件:.txt,压缩包,可执行文件 f
2.目录(文件夹): d
3.符号链接:l 软连接
4.管道:p
5.套接字: s
6.字符设备: c 键盘、鼠标
7.块设备: b u盘,硬盘等
父子间进程通信实现: ps awx | grep bash
gcc常用参数:
-v:查看版本
-I:编译时指定头文件路径: gcc main.c -I head.h的路径(./head.h) -o aa
-o: 指定生成的文件名字
-c: 生成二进制文件,即得到个.o文件
-g: gdb调试用 gcc -g main.c
静态库制作: 原材料: 源代码: a.cpp,b.cpp
将.cpp文件生成.o文件: g++ a.cpp b.cpp -c
将.o文件打包: ar rcs lib test.a a.o b.o
命令 参数 库名字 材料
库的使用: g++ test.cpp -L./lib -lmytest -o mytest
-L: 指定库的路径
-l:指定库的名字(去掉lib和.a)
一般创建的文件没有执行权限。 可以用 chmod a+x xx.sh 使其具有可执行权限 a-x:去掉可执行权限
然后 ./xx.sh 就可以执行文件中的内容
50:pdb调试代码
python3 -m pdb test1.py:调试test1.py。 等待人对程序进行操作
l==list显示当前代码,n==next向下执行一行代码,c==continue 继续执行代码
b 7:在第7行加断点。b==break。 b:查看全部断点
s:(step的意思) 进入一个调用的函数
p:打印一个变量的值
a:(args的意思) 打印所有形参数据
r:(return的意思) 快速执行到函数的最后一行
51: import os
os. fork() (本身这条命令所在位置就是一条进程,而后创建新的进程,两个进程同时判断)
创建进程,不能在windows中执行
编写完毕的代码,在没有运行的时候,称之为程序;
正在运行着的代码,就成为进程
进程,除了包含代码以外,还有需要运行的环境等等
父进程中fork的返回值,就是刚刚创建出来的子进程的id
52: 全局变量在多个进程中不共享(在一个进程里面会共享)。各自进程是各自进程的东西,互不干扰
53: 多次fork。 2的n次方
54: 通过multiprocessing中的Process创建子进程 p=Process(target=函数名) p.start()
55:主进程等待Process子进程先结束
56: p.join(num):等到对象标记的进程结束后,再执行接下去的程序。 有num的话,最大等待时间就是num,超过num主程序继续向下执行,但是依然会等待子程序先结束 #堵塞式方法
57: 进程池:通过multiprocessing中的Pool po=Pool(num) #定义最大进程数为num的进程池、、
添加任务:po.apply_async(要调用的目标(target=),(传递给目标的参数元组))
po.close()#关闭进程池,关闭后po不再接收新的请求(不能再次添加新任务) po.join():必须放在close语句之后
58:po.apply(要调用的目标,(传递给目标的参数元组)) #堵塞的方式。
添加任务目标后,等待目标(子进程)完全执行完毕后,再添加新的任务目标
59:进程间通信:Queue。使用的是Process。 q=queue()
进程池之间的通讯:适用的是Manager(从multixxx中引入)
q=Manager().Queue() 使用manager中的queue来初始化 po=polol()
管道、映射
60:多进程拷贝文件:
po.apply(write,(q,))
61:线程:thread模块(比较底层) from threading import thread
在没有多进程的前提下,可以用多线程实现软件多开
进程:资源分配的单位(开辟的空间,显示的窗口等等) 线程:进程里面真正执行代码的东西的单位,资源调度的单位
62:subl 文件名:创建新文件并打开,可在其内部进行粘贴内容(不需要调整格式)
63:,进程不共享全局变量,线程共享全局变
量(共享变量) 函数中global修饰(python中)
64:避免全局变量被修改:
永无休止的做判断:轮询: while True:
互斥锁:多个线程对同一资源。
创建锁:mutex=threading.Lock() 默认没有上锁 mutex是互斥量
这个线程和test2线程都在抢着对这个锁进行上锁,如果有1方成功上锁,那么导致另外一方堵塞(一直等待)到这个锁被解开为止。
锁定(上锁):mutex.acquire([blocking]) 释放:mutex.release()
65:死锁:两个锁互相等待对方解锁。
避免死锁的方法:1. 添加超时时间([blocking]) 银行家算法(先满足一部分需求)
66:生产者(产生数据)与消费者(处理数据)解决耦合问题:阻塞队列:from queue import Queue。 解决速度不一样的问题
67:ThreadLocal: local_school = threading.Local()
t1= threading.Thread(target,args)
:不用传参数,用一个全局变量能够完成线程里面所有数据的传递,不会因为和下一个线程代码一样而产生数据的错乱
68:异步: pool.apply_async(func=test,callback=test2) callback:回调
69: GIL:全局解释器锁 导致多进程效率大于多线程(在python中)
在linux中, gcc xxx.c 会在当前文件中生成一个a.out 使用 ./a.out,执行当前路径下的a.out文件
70:
main.o : main.c defs.h
cc -c main.c
在定义好依赖关系后,后续的那一行定义了怎样生成目标文件的操作系统命令
1、make会在当前文件夹下找名字叫“Makefile”或“makefile”的文件。
2、假设找到,它会找文件里的第一个目标文件(target),在上面的样例中,他会找到“edit”这个文件,并把这个文件作为终于的目标文件。
3、假设edit文件不存在,或是edit所依赖的后面的 .o 文件的文件改动时间要比edit这个文件新,那么,他就会运行后面所定义的命令来生成edit这个文件。
4、假设edit所依赖的.o文件也不存在,那么make会在当前文件里找目标为.o文件的依赖性,假设找到则再依据那一个规则生成.o文件。(这有点像一个堆栈的过程)
5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是运行文件edit了。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系
我们就能够非常方便地在我们的makefile中以“$(objects)”的方式来使用这个变量了
edit : $(objects)
cc -o edit $(objects)
clean :
rm edit $(objects)
71:用下面的命令运行该first.cpp文件:
g++ first.cpp -o test
./test