Linux总结
Posted 路之遥_其漫漫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux总结相关的知识,希望对你有一定的参考价值。
1 Linux第一天==================================================================================== 2 一.基础命令 3 1.history 查看历史命令,此终端自安装至现在的所有。 4 2.命令解析器: 5 1)shell. 针对Unix操作系统 6 2)bash. 针对Linux操作系统 7 3)工作方式: 用户在终端输入命令, 命令解析器搜索(通过环境变量中的路径)对应的路径,查找同名命令,如果找到了就执行该命令。 8 9 3.遍历历史命令: 10 1)从当前位置往上: ctrl+p(方向键上也行); 11 2)从当前位置向下: ctrl+n(方向键下也行); 12 13 4.光标移动: 14 1)向前 ctrl+b; 2)向后 ctrl+f; 3)移动到行首 ctrl+a; 4)移动到行首 ctrl+e; 15 16 5.删除光标位置的字符: 17 1)光标后面的字符(即光标盖住的那个字符):ctrl+d; 18 2) 光标前面的字符:ctrl+h; 19 3) 删除光标前面的字符串: ctrl+u; 20 4) 删除光标后面的字符串:ctrl+k; 21 22 二.Linux目录结构: 23 1. / 根目录:根目录下面的是系统文件,一般别动。 24 2. 终端下面的各种颜色代表不同的文件 25 1).白色: 普通文件 26 2)蓝色: 目录 27 3)绿色: 可执行文件 28 4)青色: 链接文件 29 5)红色: 压缩文件 30 6)黄色: 设备文件 31 7)灰色: 其他文件 32 33 3.根目录下面各文件的内容: 34 1)bin: (binary)二进制文件,存放命令(系统命令,可执行的程序) 35 36 2)etc: 系统或用户安装的软件用到的"配置文件"; 37 如:查看用户:etc/passwd (可以看到当前系统下的所有用户)用户登录时的用户名和密码也在该目录 38 39 3) lib: Linux操作系统运行时使用的一些基本动态库(.so)。 40 41 4)media:自动挂载外设,会将外设自动挂载到该目录下。 42 43 5)mnt: 手动挂载目录。一般默认挂载到该目录。 44 45 6)opt: 安装目录,一般是空的。 46 47 7)root: 超级用户的家目录 48 49 8)sbin: 超级用户运行时用到的命令(存放的地方) 50 9)usr(user software resource): 用户软件资源目录;(1.当前用户安装的一些应用程序,2.一些库文件(如C 的标准库))。 51 10)boot: 开机启动项 52 11) dev: 存放设备文件 53 12)home: Linux操作系统所有用户的家目录。 54 13)tmp: 存放临时文件(每次系统重新启动,都会清空) 55 56 4[email protected]virtual-machine:/home$: 字符的意义 57 1)$:表示普通用户; #:表示超级用户 58 2)@前的内容: 表示当前用户名; 59 3)@后的内容,在冒号之前: 表示主机名。 60 4)冒号后的内容: 表示当前所在的目录。 61 62 5.系统安装程序后缀 63 ubuntu 系统安装程序后缀:.deb 64 windows 系统安装程序后缀:.exe 65 安卓 系统安装程序后缀:.gdb 66 67 6.Linux 七种文件类型 68 1) d: 目录 69 2) -: 普通文件 70 3) c: 字符设备 71 4) b: 块设备 72 5) p: 管道 73 6) s: 套接字(实现局域网的传输 sorckt) 74 7) l:符号链接 75 7.创建文件: 76 1)touch 文件; 文件存在,就会更新文件的日期; 77 文件不存在,就会创建文件。 78 79 8.创建嵌套目录: 80 mkdir wbq/aa/bb -p;(注意后面的参数-p,可以加在最后面,也可以加在紧随mkdir后面) bb目录在aa目录里,aa在wbq目录里。 81 pwd 查看当前用户所在的目录。 82 83 84 8.查看文件内容: 85 1)cat+文件名: 文件内容显示在终端上 86 2)more+ 文件名:只能向下翻。回车向下走一行,空格,显示下一页。 87 3)less+ 文件名: 可以上下翻页 88 4)head -行数 文件名(从文件头部数) 89 5)tail -行数 文件名(从文件尾部数) 90 91 9.拷贝文件/目录 92 cp 存在的文件 新文件(当拷贝文件时,需要有"读权限"). 93 1)如果新文件名不存在,就创建 94 2)如果新文件名存在,就覆盖源文件(这里要注意,新文件名一般要写成不存在的,否则原来的内容就丢了) 95 cp拷贝目录 96 需要加参数 "-r"; 97 98 10.创建软硬链接 99 1)创建软连接: 100 ln -s 创建软连接的源文件名 软链接名字 101 1)使用相对路径创建的软连接,移动链接到不同的目录就不可以使用了。 102 2)解决这种问题办法: 创建绝对路径的软连接。在原文件名前加上它的绝对路径。 103 2)创建硬链接: 104 ln 创建硬链接的源文件名 硬链接名字 105 1)硬链接的文件不区分相对和绝对路径。 106 2)硬链接文件不占用磁盘空间,一改全改(不管哪个,相当于程序的静态变量) 107 108 11.修改文件权限的方法(chmod) 109 1)文字法 (r w x ) chmod 修改对象+(-)权限 文件名 110 u 用户 g 用户组 o其他人 a所有人 111 112 2)数字设定法: chmod 数字 文件名 113 写权限 对应的数字 2 114 读权限 对应的数字 4 115 执行权限 对应的数子 1 116 117 12.修改文件所有者(chown) 118 1)修改文件的所属者: chown 所有者 文件名(要使用超级用户权限) 119 2)修改文件的所属组 chown 所有者:所属组 文件名 120 3)修改文件所属组(第二种方法): sudo chgrp 所属组 文件名; 121 122 13.文件的查找和检索 123 1)根据文件的属性查找 find 124 1)根据文件名 find 查找的路径 -name "查找的文件名" 125 126 2)根据文件大小 find 查找的路径 -size 查找的大小 127 大于:+; 小于:-; 等于:(不用写) 128 如: find ~ -size +100k -size -100M (查找大于100k小于100M的文件) 129 注意: k 小写 M大写 130 "~ 当前用户的家目录(或者宿主目录)" 131 132 3)根据文件类型:find 查找的路径 -type 文件类型 133 134 2)根据文件内容查找 grep 135 1)grep -r "查找的内容" 查找的路径(可以和一些命令搭配):find ./ -type f | grep 01.c; "查找当前目录下,名字含有01.c的普通文件" 136 137 14.查看文件或目录属性 138 1)查看文件文件的字节数,字数, 行数; wc 文件名 参数 139 2)参数:-c: 文件的字符数 140 -l: 文件的行数(也可以用来喝一些命令搭配); find ./ -type f | wc -l; "查找当前目录下,普通文件的个数"。 141 -w: 文件的字节数。 142 143 15.查看指定命令所在的路径: 144 which 命令;可以查看该命令所在的文件。(cd命令例外, 它被嵌入在系统中) 145 146 16.软件的安装和卸载: 147 1. 148 1)主流安装(在线): 149 1)sudo apt-get install 软件名 : 安装 150 2)主流卸载: 151 1)sudo apt-get remove 软件名 : 卸载 152 3)更新软件列表 153 1)sudo apt-get update ; (它的工作原理是:更新软件的下载地址。)更新完后再重新下载 154 4)清空缓存: 155 1) sudo apt-get clean ; 清空在线安装后的缓存 156 缓存的路径: 157 158 2. 159 5)安装包程序安装:.deb后缀(安装包的名字) 160 161 6)安装包安装的软件卸载: 162 163 17. U 盘的挂载和卸载 164 1)挂载: mount 命令 165 1)mount + 设备名 + 挂载的目录 166 2)获取U盘设备名: 167 sudo fdisk -l; 168 3)显示中文: 169 加上参数: -o iocharset utf8 170 171 18: sd 闪盘(U盘) 172 hd 移动硬盘 173 fd 软盘; 174 175 19.压缩包管理(Linux): 176 1) 压缩格式: "(只压缩不打包)" 177 .gz格式: 178 压缩: gzip 压缩的文件; 179 缺点: 1. 压缩不保留原文件, 2.压缩的时候不能能打包。 3.不能压缩目录 180 解压缩: gunzip 压缩包名 181 182 .bz2格式: 183 压缩: bzip2 压缩的文件;(如果想保留源文件;加参数 -k; bzip2 压缩的文件 -k ) 184 解压缩: bunzip2 压缩包名; 185 缺点: 1.压缩的时候不能打包, 2.不能压缩目录 186 187 2)常用的压缩工具:"(只打包不压缩)" 188 1)tar:打包。 189 参数:j- (指定的压缩工具) 190 z- (指定的压缩工具) 191 c- 创建新的压缩文件 192 x- 从压缩文件中释放文件 193 v- 详细报告压缩文件信息 194 f- 指定压缩文件的名字 195 196 2)压缩语法: 197 tar 参数 压缩包名称 原材料(参数,与压缩工具配合;zc. jc. ) 198 1)zcvf 199 tar zcvf test.tar.gz 需要压缩的文件 200 2) jcvf 201 tar jcvf test.tar.bz2 需要压缩的文件 202 203 3)解压缩: 204 tar 参数 压缩包名 205 语法: 206 .tar.gz后缀的压缩文件 tar zxvf test.tar.gz 207 .tar.bz2后缀的压缩文件 tar jxvf test.tar.bz2 208 209 解压缩到指定目录: 210 (参数) -C 指定的目录(路径)。 211 tar zxvf test.tar.gz -C 路径 212 tar jxvf test.tar.bz2 -C 路径 213 214 3) 非主流的压缩文件:rar 215 1)安装软件: rar (sudo apt-get install rar) 216 217 2)压缩: 218 1)rar a 压缩包名 原材料; (压缩包的名字不需要添加后缀) 219 rar a test 需要压缩的文件 220 2)-r 参数(压缩目录): rar a test 需要压缩的文件 -r; 221 222 3)解压缩:rar x 压缩包名 223 rar x test.rar (知道那个的目录,可加可不加); 224 225 4)zip 226 1)压缩: 227 压缩目录(加参数 -r);(zip (-r) 压缩包名 原材料);包名不需要后缀 228 zip test 需要压缩的文件; zip -r test 需要压缩的目录 ; 229 2)解压缩: 230 unzip 压缩包名 (-d) 解压缩的目录(路径) 231 unzip test.zip (解压在当前目录); unzip test.zip -d 指定的目录 232 233 4)-的使用时机: 234 235 20.进程管理: 236 1) who 当前登录操作系统的用户和终端设备编号 237 2) tty 238 3) PID 进程的ID号。 239 查看整个系统 的运行状况:ps 240 4) ps aux | grep 查找的东西 241 5) 242 243 21.手动杀死进程 244 1)kill -9(SIGKILL) 进程PID; 245 2)查看kill的信号: kill -l; 246 247 22.查看环境变量:env 248 1)环境变量的格式:key = value:value:value:……; 249 250 23.任务管理器: top 251 1)关闭它: q 或者 ctrl + 252 253 24.网络管理: 254 1)获取网络接口的信息:ifconfig 255 2)测试与其他主机的连通性 256 参数 257 258 3) 259 260 三。用户管理 261 1.添加用户: 262 1) sudo adduser 263 2.添加用户组 264 265 vi etc/passwd; vi etc/group; 266 267 3.切换用户:su; sudo su;这两个操作的区别 268 1)普通用户 269 2)超级用户 270 4.修改用户密码: 271 1.修改普通用户的密码 272 sudo passwd 用户名 273 2.修改超级用户的密码 274 275 5.删除用户 276 sudo deluser 用户名 277 6.删除组: 278 279 7.退出: 280 281 命令:动词在后面 282 脚本:动词在前面 283 284 四。常用服务器搭建: 285 1.FTP服务器的搭建: 286 1)它是:一款软件;用户来上传和下载文件。 287 2)服务器端: 288 a.安装软件:sudo 289 b.服务器端需要设置: 290 291 3)重新启动服务,使配置生效 292 sudo 293 294 4)客户端的操作 295 1.实名用户登录: 296 297 2.上传个下载文件(注意:只能操作文件,不能操作目录) 298 299 1)缺点: 300 1)需要告诉对方服务器密码; 301 2)用户可以在服务器任意目录切换 302 303 3.匿名用户登录: 304 必须指定匿名用户登录目录 305 306 五:lftp客户端的使用 307 1.只是一个登录ftp 服务器的客户端 308 2.使用前先安装: sudo apt-get install lftp 309 3.登录ftp服务器 310 1.lftp IP(服务器的IP); 311 2.login --- 匿名用户登录 312 313 4.基本操作: 314 基本操作: put, get;(与自带的ftp功能一样) 。 315 上传多个文件: mput 文件名; 316 下载多个文件: mget 文件名 317 下载目录: mirror 目录名; 318 上传目录: mirror -R 目录名; 319 320 六: 查看掩码:命令 umask ; 321 它的作用: 本地的掩码: 0002;本地创建的目录权限为 775; 满权限为 777; 可以看出实际权限 = 满权限-掩码 322 本地创建的文件的权限为 664; 本地的目录权限 - 文件权限 = 111; 可以看出:文件默认不会给它执行权限。 323 324 "目录必须有执行权限才能被打开。" 325 ftp上传的文件默认权限为 700; 此时只有 ftp 用户可以操作,不合理;需要修改配置文件;anoy_umask=022; 这样ftp用户传输到服务器的文件权限就为 755了; 326 目录权限与掩码的关系: 目录权限 = 777 - 掩码; 327 文件权限与掩码的关系: 文件权限 = 777 - 掩码 - 111; 328 329 七:nfs网络共享服务器的搭建和使用 330 1.nfs ===相当于windows的共享目录 331 2.服务器端: 332 1.安装服务器程序:sudo apt-get install nfs-kernel-server; 333 2.创建一个共享目录: 334 1)设置配置文件: /etc/exports; 添加一个共享的目录(绝对路径)和 ip 地址段和(权限); 335 2)权限: ro ----只读; rw ----读写; sync -----数据实时同步 336 例如: /home/yyx/xuexi 192.168.22.*(rw,sync) 这个ip地址为:允许这个网段的用户挂载共享路径。 337 3.重启服务: sudo service nfs-kernel-server restart; 338 339 3.客户端: 340 1.通过挂载服务器共享目录的方式: 341 sudo mount serverIP(服务器的Ip):共享的路径 挂载的路径; 342 2.退出方式: 343 与普通挂载一样。sudo umount 挂载的路径 344 345 八。ssh服务器的使用:(管理员才会使用)。 346 1.作用: 远程登录程序; 347 2.软件的安装: sudo apt-get install openssh-server; 348 3.远程登陆: 349 ssh 用户名@IP(要远程登录的用户名和它的IP) 350 4.退出:logout。 351 352 九。超级拷贝 353 scp命令: 安装软件:sudo apt-get install openssh-server 354 命令: scp-r (远程服务器用户名@IP(远程):远程服务器的目录 拷贝到的本地目录) 355 scp -r [email protected]192.168.28.37:/home/Robin/share ~/test 356 357 358 "——————————————————————————————————————————————————————————————————————————————————————————————————————————————————" 359 FTP 服务器搭建和登录 360 1.先安装服务器: 命令: sudo apt-get install vsftpd 361 2.修改配置文件: 命令:sudo vi /etc/vsftpd.conf; 362 3.重启ftp服务: 命令: sudo service vsftpd restart; 363 4.此时只允许实名用户登录和操作,匿名用户只能登录。 364 5.匿名用户登陆设置:创建一个专属匿名用户根目录。 365 1)修改配置文件:添上专属根目录 366 2)重启ftp服务器 367 6.此时就都可以登录和使用了 368 7.用户登录:ftp IP(服务器的IP); 369 1)匿名用户登录:用户名:anonymous; 密码:不需要 370 8.传输数据: put; 下载数据: get; 371 9.弊端:只能操作文件,不能操作目录。 372 "——————————————————————————————————————————————————————————————————————————————————————————————————————————————————" 373 374 "——————————————————————————————————————————————————————————————————————————————————————————————————————————————————" 375 lftp 客户端的使用; 376 377 "——————————————————————————————————————————————————————————————————————————————————————————————————————————————————" 378 379 十。 VI 的三种模式: 380 1. 命令模式: 381 h左 j下 k上 l下(左右在两端,上下在中间); 382 2. 文本模式: 383 3. 末行模式: 384 385 4.一些基本操作: 386 1.光标移动到文件开头: gg; 光标移动到文件尾部: G; 387 2.光标移动到行首:0; 光标移动到行尾: $; 388 3.行跳转【如: 13行】: 13G; 389 4.删除光标后的字:x; 删除光标前的一个字: X; 删除一个单词: dw; 390 5.删除光标前本行的内容:d0; 删除光标后本行的内容: D; 391 6.删除光标所在行: dd; 删除多行: 行数 + dd; 392 7.撤销: u; 反撤销: ctr + r; 393 8.复制:复制当前行:yy; 复制从当前行以下 n 行: n yy; 394 9.粘贴: 从光标所在位置下一行粘贴: p; 从光标当前行位置粘贴: P; 395 396 5.可视模式: 397 命令: v; 进入模式后,可以有选择的拷贝和删除(如只拷贝一行中的某些内容) 398 399 6.查找操作: 400 从光标位置向上查找:?+查找的内容; 从光标位置向下查找:/ + 查找的内容; n ----遍历操作 401 查光标所在位置的内容: 命令 #; 402 7.替换操作: 单字符替换:命令 r(再输入自己想输入的内容。)替换光标后的字符; 403 404 8.创建新行:命令 o:当前光标所在行的下面; 命令 O:相反。 405 删除光标当前行:S,然后进入文本模式; 删除光标前一个字符:s,然后进入文本模式; 406 407 9.末行模式下的替换: 408 1)先在命令模式下进行查找操作,然后在末行模式下替换。 409 2):s/查找的内容/替换的内容; 410 411 10.分屏操作: 412 水平分屏:sp+文件名 ; 垂直分屏:vsp+文件名 ; 屏幕切换:ctr + ww; 413 414 11.打日志: -D, -I; -g; -Wall; -O优化等级 415 416 417 "----------------------------------------------------------------------------------" 418 12.生成静态库: 419 1.命名格式:libxxx.a 420 2.制作: 421 1)生成 .o文件;gcc -c .c文件 -I(.c文件中使用的)头文件所在路径(自己编写的头文件); 422 如:"gcc -c *.c -I ../include;" 423 424 2)将生成的.o文件打包; ar rcs 静态库的名字 所有的.o文件 425 例如: "ar rcs libCalc.a *.o;" 426 427 查看打包后的静态库: nm 名字; 428 "nm libCalc.a;" 429 430 3.静态库的使用:"(-I 后面的路径可以加空格(版本高的,可加可不加),可以不加(版本低的))" 431 1)第一种方法; gcc + 测试.c文件 -o 可执行程序的名称 -I头文件的路径 静态库的路径 432 例如:gcc main.c -o app -I ./include lib/libcacal.a; 433 2)第二种方法: gcc + 测试文件 -o 可执行程序名称 -I 头文件的路径 -L 静态库的路径 -l xxx(静态库的名字,掐头去尾(去掉lib 和 .a)); 434 例如:gcc main.c -o app1 -I ./include -L ./lib -l cacal; 435 4.静态库的优缺点: 436 优点: 1)库被打包到可执行程序中,直接发布可执行即可使用。2)寻址方便,速度快 437 438 缺点: 1)静态库的代码在编译时被载入可执行程序,所以静态库越大,可执行程序越大(这也导致了它的第一个优点); 439 2)当静态库的改变了,可执行程序也必须重新编译。 440 3)每个使用静态库的进程都要将库编译到可执行文件中再加载到内存中,内存消耗严重。 441 442 5.问题1: 443 13.生成动态库: 444 1.命名格式:libxxx.so 445 2.制作: 446 1)生成与位置无关的 .o; gcc -fPIC -c 编译的.c文件 -I (.c文件中)头文件的路径; 447 例如: gcc -fPIC -c *.c -I ../include; 448 449 2) 打包;gcc -shared -o 生成的动态库的名字 .o文件; 450 gcc -shared -o libCalc.so *.o ; 451 452 3.动态库的使用:gcc main.c -o 可执行程序的名字 -I (main.c中头文件路径) 动态库的路径+动态库的名字 453 gcc main.c -o app2 -I ../include lib/libCalc.so; "注意:这里面动态库的路径不加-L参数,生成的执行程序运行不起来" 454 455 4. ldd + 可执行程序; 456 查看程序执行时,调用的动态库。 457 458 5.手动添加动态库的方法: 459 1)临时添加:(测试的时候使用;) 460 2)永久添加:(修改家目录的bashrc文件) 461 3)修改配置文件的方式:修改动态链接器的配置文件 462 更新动态链接器: 463 查看链接器的路径:sudo ldconfig -v参数。 464 465 6.动态库加载失败的原因: 466 1)解决方案: 467 a. (临时方案,用于程序测试)使用环境变量: LD_LIBRARY_PATH=动态库的路径; 然后倒入环境变量: export LD_LIBRARY_PATH 468 b.(永久设置。)修改动态链接器的配置文件: 469 c.(修改家目录的 .bashrc文件); 470 7.动态库的优缺点: 471 优点:多进程共享一份库文件,节省内存,易于更新 。 472 缺点:相较于静态库而言库函数访问略慢。 473 14.使用静态库的参数操作动态库,看能否跑起来。(不能加静态库的操作参数) 474 475 "-----第四天-----------------------------------------------------------------------------" 476 15. 其他命令: 477 1) alias 当前命令="加强版的命令"; 478 alias gcc=‘gcc -std=c99‘; 使gcc 的默认编译按照 c99 规范。(在家目录的bashrc配置文件中); 479 2)echo 取变量的值:echo $变量名;(取出变量的值)变量名前加 $; 480 例如:echo $PATH;(取出环境变量的值); 481 "取最近的函数的返回值: echo $? " 482 十一。windows中的动态库 483 1. xxx.dll(windows中的动态库名后缀); 484 2." 动态库与静态库发布时的区别:" 485 486 487 十二。gdb 调试: 488 1.得到包含调试信息的可执行性程序: 489 gdb -g main.c -o app -I ../include ; 490 491 2.运行调试程序: 492 gdb 可执行程序名; 493 494 3.命令: 495 1)执行命令:两种 start 一行一行执行,执行过程中可以添加其他参数调试。 496 run 直接执行到程序结束。 497 2)查看程序内容: l (什么都不加);l + 行号; l + 函数名; l + 函数名:行号; 498 499 3)加断点:b 行数 ; 查看断点信息:i b; 删除断点:del b 断点编号 500 501 4)继续执行程序:c ; c + 断点编号(跳到此段的位置); 打印内容:p 变量名; 往下执行一步:n 502 503 5)自动追踪变量的值:display + 变量名;查看追踪变量的编号:i display; 取消追踪: undisplay + 追踪变量编号 504 505 6)跳出循环:1)设置变量的值:set var 变量名=值; 506 2)在循环的的外面设一个断点,跳到该断点。 507 508 7)获取变量的类型:ptype 变量名; 509 510 8)进入到函数体的内部:s ;跳到下一个断点: c 。 511 512 9)跳出当前函数:finish; 513 514 10)条件断点:b 17 if i == 10(当i等于 10 时 17 行打断点,注意:断点不能设在 for 循环的那行,不会停止); 515 516 十三. Makefile 文件编写; 517 掌握内容: 518 一个规则,两个函数,三个自动变量 519 520 1.命名:makefile; Makefile; 521 2.用途: 522 项目代码编译管理;节省编译项目的时间; 523 3.Makefile 中的规则: 524 目标:依赖; 525 生成一个 app 执行程序;需要依赖的函数; 526 命令:编译命令; 527 528 标准格式:"目标 : 依赖(依赖这个位置不一定非得有,有的时候是没有的。如下面的 make clean:) 529 命令" 530 操作界面的:make 目标;==========》 531 4.工作原理: 532 1)若想生成目标,检查规则中依赖的条件是否存在;如果不存在,寻找是否有规则用来生成该条件 533 534 2)检查规则中目标是否需要被更新,必须检查它的所有依赖;依赖中有任何一个被更新,则目标必须被更新。(规则:"依赖文件比目标时间晚,则需要被更新。") 535 536 5.Makefile编译版本:"makefile中所有的函数都有返回值" 537 1)版本1: 538 539 缺点:效率低,每次修改任意一处,都需要编译所有的源文件。 540 541 2)版本二: 542 543 缺点:冗余。 544 "app:main.o div.o mul.o sub.o //第一个条件 545 gcc main.o div.o mul.o sub.o -o app 546 547 main.o:main.c //第一个条件的依赖条件生成 548 gcc -c main.c 549 div.o:div.c 550 gcc -c div.c 551 mul.o:mul.c 552 gcc -c mul.c 553 sub.o:sub.c 554 gcc -c sub.c" 555 556 3)版本三:(使用了变量) 557 1.Makefile中的变量: 变量名=value 558 559 2.Makefile中的自动变量: 560 1)[email protected]: 规则中的目标 561 2)$<: 规则中的第一个依赖 562 3) $^: 规则中的所有的依赖 563 注意: 这三个只能在命令中使用。 564 565 3.Makefile中自己维护的变量: 566 CPPFLAGS=头文件的路径; 567 568 缺点:相关的文件不能自动查找 569 "代码: 570 obj = main.o div.o mul.o sub.o 571 target = app3 572 CPPFLAGS=-I ../aa/ 573 574 #第一条目标 575 $(target):$(obj) 576 gcc $(obj) -o $(target) 577 578 #第二条目标 579 %.o : %.c 580 gcc -c $< $(CPPFLAGS)" 581 582 583 4) 版本四: 584 1.makefile 中的函数: 585 1)所有的函数都有返回值 586 2)wildcard---查找指定目录下指定类型的文件 587 "src = $(wildcard ./*.c);" 588 patsubst---匹配替换 589 obj = $(patsubst %.c,%.o,$(src)) 590 缺点: 功能不够强大 591 "代码: 592 src = $(wildcard ./*.c) 593 target = app 594 obj = $(patsubst %.c, %.o, $(src)) 595 CPPFLAGS = -I ./ 596 597 $(target):$(obj) 598 gcc $(obj) -o $(target) 599 600 %.o:%.c 601 gcc -c $< $(CPPFLAGS)" 602 603 5) 版本五:删除编写过程中的临时文件 604 1.生成一个与终极目标无关的目标:clean 605 make clean 606 607 1.声明伪目标:.PHONY:变量的名; 608 伪目标特点:makefile 不会检查目录下是否有这样的文件,也不会对它的时间做检查 609 610 2.-的作用:、该命令如果错误,跳过该命令,继续执行下一条命令。 611 clean: 612 -rm $(obj); 有提示:(当前命令无法执行时有提示) 613 -f的作用:强制删除当前 614 -rm -f $(obj); 无提示:(当前命令无法执行时无提示) 615 "代码 616 src = $(wildcard ./*.c) 617 target = app 618 obj = $(patsubst %.c, %.o, $(src)) 619 CPPFLAGS = -I ./ 620 621 $(target):$(obj) 622 gcc $(obj) -o $(target) 623 624 %.o:%.c 625 gcc -c $< $(CPPFLAGS) 626 627 clean: 628 -rm -f $(obj)" 629 630 终极目标:第一条目标所依赖的规则; 631 "每级目标时间比每级依赖时间晚。" 632 633 十四。linux系统的 IO 函数: 634 linux 每运行一个程序(进程),操作系统都会为其分配一个 0~4G 的虚拟内存空间(32位操作系统)。 635 636 1.C库函数: 637 1)fopen 函数返回值:一个文件指针(结构体):(包含三个方面:1.文件描述符, 2.文件读写位置, 3.I/O缓冲区(内存地址)); 638 文件描述符:描述符表:相当于一个数组,大小为1024; 639 一个进程最多打开1024个文件; 640 641 2)缓冲区的数据往磁盘上写内容的三种情况: 642 1.刷新缓冲区:(fflush) 643 2.缓冲区已满; 644 3.正常关闭文件(fclose); 或者:main函数中(return, exit); 645 "注意:标准C库函数 有缓冲区,而linux 系统函数 没有缓冲区 "; 646 3)ELF(Linux下可执行程序的格式): 647 ELF中存放的是源代码,他有一个入口,main函数。主要分为三段:.bss(未初始化的全局变量);.data(已初始化的全局变量); text(代码段) ; 648 649 650 4) PCB:进程控制块;其中有一个文件描述表(其中存储文件描述符;一个文件占用一个文件描述符),是一个数组,有1024个大小;所以一个进程之内最多只能打开1024个文件。 651 每打开一个新文件,则占用一个文件按描述符,而且使用的是空闲的最小的一个文件描述符。 652 653 "代码区是栈模型"。 654 655 656 657 "-----第五天-----------------------------------------------------------------------------" 658 一.系统 I/O 函数: 659 1.open() 函数当文件不存在时,创建文件,并为它指定权限;(函数的第二个参数,各种宏定义; 第三个参数:指定权限,与掩码的取反再按位与得出文件最后的权限)。; 660 1)正常打开, 2)创建文件; 3)文件截断; 661 2.文件截断: 662 663 3. perror() 函数的使用:头文件stdio.h; 打印错误信息。; 664 665 4. read() ; size_t(无符号整型); ssize_t(有符号整型);(UNIX 的类型); 666 667 5. linux系统函数的注意事项:需要判断函数的返回值。-1,失败; 668 669 6.Linux系统函数实现文件的拓展: 670 第一步 lseek(fd, 1000, SEEK_END ); 671 第二步 write(fd, "a", 1); (必须有一次写操作)。 672 "拓展的部分为空洞文字;有空洞文字的文件叫空洞文件,作用: 提前占用磁盘空间,下载中的应用:防止下载一半,空间不够。" 673 674 7.stat()函数: 675 1.off_t(unix 中的整型); 676 2.应用(断点续传;) 677 678 679 8.一些命令的穿透功能:如:vi; cat; (遇到软连接时) 680 不穿透的:如: rm; (遇到软连接时) 681 682 9.chmod() 683 684 10.chown()函数的参数查找;必须在配置文件中查找 685 686 11.unlink()函数;(删除一个文件:软硬链接) 687 函数使用场景:实现能够自动删除临时文件; 688 注意点:当文件在打开状态时:open(),并没有关闭;unlink,当close的文件的时候,会自动删除。 689 "例如: 690 int fd = open("san.txt", O_RDWR); 691 unlink("san,txt"); //删除文件,当前状态不会删除 692 write(fd, buf1, 102); 693 lseek(); 694 read(fd, buf, 200); 695 close(fd); //此时文件 san.txt 才会自动删除 696 " 697 12.chdir:修改当前进程的路径 698 int chdir(const char *path); path:当前进程的名字。 699 700 13.getcwd:获取当前进程的工作路径。char* getcwd(char* buf, size_t size); 701 参数:buf--缓冲区,存储获取到的工作路径。 702 size--缓冲区的最大容量。 703 704 14.mkdir--创建目录: int mkdir(const char* pathname, mode_t mode ); 705 参数: pathname: 创建的目录名。 mode: 目录权限(8进制)。给出的权限经过换算之后才会得到最终权限。(mode & ~umask & 0777) 706 707 708 709 710 711 "-----第六天-----------------------------------------------------------------------------" 712 713 1.版本控制:svn/git; 714 715 2.进程的概念: 716 1)程序和进程; 717 2)并发: 718 3)单道程序设计/多道程序设计 719 4)CPU/MMU 720 5)PCB: 721 3.环境变量控制 722 1)echo $名称; 查看该名称的环境变量。 723 2)查看系统的环境变量: env; 724 3)获取环境变量的值:char *getenv(const char* name); 获取键name环境变量的值。 725 4)设置环境变量:int setenv(const char *name, const char *value, int rewrite); 将环境变量name的值设置为 value。 726 如果环境变量 name 已存在;则 rewrite 非0,覆盖原来的环境变量;rewrite为0,则不覆盖原来的环境变量。 727 5)删除环境变量: void unsetenv(const char *name) 删除 name 的定义; 728 729 6)进程里可以设置自己的环境变量,避免设置在终端,影响他人。 730 4.环境控制原语: 731 1)fork: 732 2)wait/waitpid 733 3) 734 735 5. printenv.c 736 737 6.进程的状态:4 种或 5 种,都对。 就绪, 运行, 睡眠, 停止。 738 739 7.CPU的组成状态: 运算器,寄存器,控制器,译码器。 740 741 操作系统完成进程调度。(cpu进行时钟周期运算) 742 cpu的分时复用功能,使进程看起来像多进程。 743 在单核 cpu 上,同一时间只能有一个进程处于运行状态。那么多核 cpu,就可以有多个进程处于运行状态。 744 745 8.进程原语: 746 1)创建子进程。pid_t fork(); 调用1次,返回两次;在父进程返回子进程的 PID, 在子进程返回0. 747 2) fork()的工作进程:先调用 creat(),创建一个进程, 在调用 clone(),给子进程复制父进程的内容; 748 3)pid = fork(); //此时父子进程就都出来了。 749 4)pid_t getpid(); 返回调用进程的PID号; 750 pid_t getppid(); 返回调用进程的父进程的PID号 751 当在子进程中 getpid(),得到的值与 fork()父进程的返回值相等,都是这个子进程的id号 752 5)父子进程:读时共享,写时复制。 753 6)最大创建进程 个数; 754 9. uid_t getuid(void); //返回实际用户id; 755 uid_t geteuid(void); //返回有效用户id; 756 "注意: 文件实际用户与有效用户在创建该文件的家目录下时,如果没有修改,此时是相通的。 757 当文件被拷贝到root目录时, " 758 设置用户id; chmod 04755; 4 是设置用户ID。 完后效果为 -rwsr-xr-x; s表示设置了用户ID。 759 作用:当执行此文件时,执行者有效用户ID变为此文件的所有者。 760 设置用户组ID: chmod 06777; 6 是设置用户ID和组ID; 效果为: -rwsrwsrwx; 761 762 10. exec族函数的使用: 763 1)功能: 去磁盘中加载另一个可执行程序,用它的代码段、数据段替换掉当前可执行程序的代码段、数据段;然后从后加载的这个程序退出,被替换的程序后续代码就不执行了。(换核不换壳,) 764 2)一般情况下:与 fork() 函数联合使用;。 同时exec族函数不会创建新进程, 所以该程序的 ID 不会改变。 765 766 3)函数的返回值: 成功没有返回值,运行完毕,自己退出。 767 失败返回 -1; 768 4)exec族函数的规律: l(list):命令行参数列表。 p(path): 搜索file时使用path变量。 769 v(vector):使用命令行参数数组。 e(environment):使用环境变量的数组,不使用进程原有的环境变量,设置新加载程序的环境变量; 770 771 5)int execl(const char *path, const char *argc, ...); 772 例如:execl("./bin/ls", "ls", "-l", "-a", NULL); 这几个参数的作用:其中第一个参数:"./bin/ls",命令的环境变量(即所在文件),不可以改变,必须完整正确; 773 "ls":占位参数,可以随便写,一般写成该命令。(不能缺失,如果缺失了,就会把后面的命令参数变为占位参数,输出结果会出错。) "-l","-a"该命令的参数。 NULL:卫兵,执行到这里时命令结束。 774 775 11. toupper():将小写字母变为大写。 776 777 12.僵尸进程,孤儿进程: 778 1)S:睡眠状态; Z:僵尸状态; 779 2)僵尸进程的产生原因:用户空间释放,内核空间的PCB没有释放,等着父进程回收。(它消耗的是内核当中的内存资源) 780 即:子进程退出,父进程没有回收子进程资源(PCB),则子进程变为僵尸进程。 781 3)子进程的PCB(在内核空间)没有释放,是留给父进程回收用的。只有父进程回收后,僵尸进程才会消失。 782 4)杀死僵尸进程的办法是杀掉它的父进程。 783 784 孤儿进程:父进程先于子进程结束,则子进程变为孤儿进程,子进程的变为1号进程init进程,由1号进程领养。 785 786 "僵尸进程比孤儿进程更危险, 因为它不会自动关;,而孤儿进程会由 1 号进程领养,当它执行完毕后,会被 1 号进程回收"。 787 做开发时主要避免的是僵尸进程的产生。用 wait(); waitpid(); 来避免僵尸进程的产生。 788 789 790 13. pid_t wait(int* status); (阻塞函数,等待回收子进程资源;如果没有子进程,返回-1); 791 1)返回值:回收的子进程的ID号, wait(NULL);不关心子进程如何死亡,直接回收。 792 wait(&st); 用st来保存子进程死亡时的状态。 793 794 2) 父进程的ID与它的进程组ID相同;子进程的组ID与父进程的ID相同。 795 kill -9 -父进程的ID(即组进程的ID),这个进程组的所有进程都被杀死。"(注意 - 不能少)" 796 797 14.pid_t waitpid(pid_t pid, int *status, int options); (设置非阻塞。) 798 第一个参数 pid的值类型: 1) < -1; 回收指定进程组内的任意子进程。(因为父进程与子进程属于统一进程组,父进程与孙子进程属于不同的进程组,但是他们有血缘关系。) 799 -1;回收任意子进程(只要有血缘关系就行。) 800 0; 回收 当前调用 waitpid 一个进程组的所有子进程。 801 > 0; 回收指定ID的子进程。 802 第二个参数:保存子进程的推出状态。 803 804 第三个参数:WNOHANG:如果没有子进程退出,立即返回。(实现了非阻塞的 wait). 805 806 807 808 809 14.管道的特性:数据只能一个读,一个写,必须是一个方向。 810 半双工:数据同一时刻只能有一个流向。即只能父进程写,子进程读; 或子进程写, 父进程读。 811 全双工:数据同一时刻可以两个方向。 812 单工:数据只能同一个方向流动。 813 dup2(int oldfd, int newfd); 将第一个参数拷贝给第二个参数。
以上是关于Linux总结的主要内容,如果未能解决你的问题,请参考以下文章