首页 > 代码库 > Linux总结

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.yyx@yyx-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         写权限 对应的数字      2114         读权限 对应的数字     4115         执行权限 对应的数子 1116 117 12.修改文件所有者(chown)    118     1)修改文件的所属者:  chown 所有者 文件名(要使用超级用户权限)119     2)修改文件的所属组      chown  所有者:所属组  文件名120     3)修改文件所属组(第二种方法): sudo chgrp 所属组 文件名;121 122 13.文件的查找和检索123     1)根据文件的属性查找 find124         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)根据文件内容查找 grep135         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 utf8170 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)zcvf199                 tar zcvf test.tar.gz 需要压缩的文件 200                 2) jcvf201                 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.bz2208 209             解压缩到指定目录:210             (参数)    -C 指定的目录(路径)。211                     tar zxvf test.tar.gz  -C 路径212                     tar jxvf test.tar.bz2 -C 路径213 214     3) 非主流的压缩文件:rar215         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)zip226         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) tty238     3)  PID 进程的ID号。239     查看整个系统 的运行状况:ps240     4) ps aux | grep 查找的东西241     5242 243 21.手动杀死进程244     1)kill -9(SIGKILL) 进程PID;245     )查看kill的信号: kill -l;246 247 22.查看环境变量:env248     1)环境变量的格式:key = value:value:value:……;249 250 23.任务管理器: top251     1)关闭它: q 或者 ctrl +252 253 24.网络管理:254     1)获取网络接口的信息:ifconfig255     2)测试与其他主机的连通性256         参数257 258     3259 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 lftp309     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 - 掩码 - 111328 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-server354     命令: scp-r (远程服务器用户名@IP(远程):远程服务器的目录  拷贝到的本地目录)355         scp -r Robin@192.168.28.37:/home/Robin/share ~/test356 357 358 "——————————————————————————————————————————————————————————————————————————————————————————————————————————————————"359 FTP 服务器搭建和登录360 1.先安装服务器: 命令: sudo apt-get install vsftpd361 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.a420         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.so445         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_PATH468                 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  变量名;  往下执行一步:n502 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等于 1017 行打断点,注意:断点不能设在 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 app546 547             main.o:main.c                             //第一个条件的依赖条件生成548                 gcc -c main.c549             div.o:div.c550                 gcc -c div.c551             mul.o:mul.c552                 gcc -c mul.c553             sub.o:sub.c554                 gcc -c sub.c"555 556         3)版本三:(使用了变量)557             1.Makefile中的变量: 变量名=value558             559             2.Makefile中的自动变量:560                 1)$@:    规则中的目标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 = app3572                 CPPFLAGS=-I ../aa/573 574                 #第一条目标575                 $(target):$(obj)576                     gcc $(obj) -o $(target)577 578                 #第二条目标579                 %.o : %.c580                     gcc -c $< $(CPPFLAGS)"581 582 583         4)    版本四:584             1.makefile 中的函数:585                 1)所有的函数都有返回值586                 2)wildcard---查找指定目录下指定类型的文件587                         "src = http://www.mamicode.com/$(wildcard ./*.c);"588                    patsubst---匹配替换589                            obj = $(patsubst %.c,%.o,$(src))590             缺点: 功能不够强大591             "代码:592                 src = http://www.mamicode.com/$(wildcard ./*.c)593                 target = app594                 obj = $(patsubst %.c, %.o, $(src))595                 CPPFLAGS = -I ./596 597                 $(target):$(obj)598                     gcc $(obj) -o $(target)599 600                 %.o:%.c601                     gcc -c $< $(CPPFLAGS)"602 603         5)  版本五:删除编写过程中的临时文件604             1.生成一个与终极目标无关的目标:clean605                 make clean606 607             1.声明伪目标:.PHONY:变量的名;608                 伪目标特点:makefile 不会检查目录下是否有这样的文件,也不会对它的时间做检查609 610             2.-的作用:、该命令如果错误,跳过该命令,继续执行下一条命令。611                 clean:612                     -rm $(obj);        有提示:(当前命令无法执行时有提示)613               -f的作用:强制删除当前    614                     -rm -f $(obj);    无提示:(当前命令无法执行时无提示)615                 "代码616                     src = http://www.mamicode.com/$(wildcard ./*.c)>617                     target = app618                     obj = $(patsubst %.c, %.o, $(src))619                     CPPFLAGS = -I ./620 621                     $(target):$(obj)622                         gcc $(obj) -o $(target)623 624                     %.o:%.c625                         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/MMU720     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/waitpid733     3)734 735 5. printenv.c736 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总结