Linux 基础编程

1、Linux下的快捷键:

      Ctrl + p 上一条命令;Ctrl + n下一条命令

      Ctrl + b 向前移动光标,Ctrl + f 向后移动光标

      Ctrl + a 光标移动到命令行开头,Ctrl + e移动到行位

      Ctrl + h 删除光标前一个字符,Ctrl + d删除光标后一个字符

      Ctrl + u删除光标前面所有字符

2、Linux目录结构

      1)根目录 / ls/cd / 查看或进入根目录
      2)/bin:经常使用的命令
      3)/boot:开机启动项 不要改
      4)/dev:设备文件,linux外部设备
      5)/etc:主要保存的是操作系统需要的配置文件
      6)/home: 用户的文件夹,普通用户
      7)/lib:存放的都是需要的动态链接库也称之为共享库
      8)/lost+found:存的都是文件碎片
      9)/media:挂在外设的,U盘,光驱,挂在成功后里面就是u盘里面的内容。
      10)/mnt:和上面一样,手动挂载
      11)/opt:第三方软件
      12)/proc:内存映射
      13)/root:超级用户自己的目录
      14)/sbin:管理员使用的
      15)/usr:是一个用户应用程序和文件都放在这个目录下,类似于program file 目录

3、cd - 去上一个目录

4、前面提示字符串代表的意思:ubuntu@ubuntu:~$
        当前登录的用户@在哪 ubuntu主机名(创建Linux时自己创建的) ~用户的家目录,也叫宿主目录,$代表当前用户为普通用              户,超级用户是#
        exit退出root用户

5、tree 加目录可以查看目录里面所有的文件

6、d是目录,l链接文件,b块设备,c字符设备,s是Socket文件,p是管道文件 f普通文件  压缩文件是普通文件

7、文件的创建和删除

      mkdir 创建文件夹

      mkdir aa/bb/cc -p 创建嵌套的目录

      rm -ri 会提示是否要删除的信息

      删除文件夹时要rm-r

8、文件和目录的拷贝

      cp dirname /dirpath   会把这个文件复制到你想要复制的地方

      cp dirname/* dirpath  把这个文件夹下面的所有东西赋值到指定目录,但是不包括这个目录本身

9、显示文件中的内容 

      最常用的就是cat

      head/tail 加参数 可以显示文件 前多上行和后多少行   head -10 dirName

      还有more less 不会一下全显示出来,按回车可以继续

10、mv命令

        1)、更改文件名称 mv dirneme ./dirname2

        2)、移动到某个文件夹下  mv dirname  /dirPath

11、软/硬链接

        软:ln -s dirName(文件名) dirName(链接名) 尽量用绝对路径来创建链接,否则无法全局使用,还可以给目录创建软连接

        硬:ln  dirName(文件名) dirName(链接名) 不加参数 不能给目录硬链接

12、不常用命令

       which命令,查看命令在那个目录下

       date 查看当前时间

       history查看自己以前输入过什么命令

       who查看当前用户状态

       man man 进入man手册 

       echo 输出字符串 echo $PATH 打印环境变量 

13、修改文件权限

        1)、查看当前登录用户 whoami

        2)、修改文件权限:chmod [who] [+|-|=] [mode]

               [who]  :所属用户 :u  所属组:g 其他:o 所有:a

               [+|-|=]:增加,删除,覆盖某个权限

               [mode] r w x

        3)、例: chmod u+w fileName

        4)、数字设定

               chmod 777 fineName

               chomd -001 fileName 减少某个属性

14、修改文件所有者和所属组:

       chown 改变所有者   chown 所有者名称 文件名 

       chown 用户名1:用户名2  改变文件所有者和所属者 所有者是用户名1,所属组是用户名2

       chgrp改变文件所属组

       文件必须有执行权限 X

15、查找文件或内容

        find 查找的目录 -name 文件名

        find 查找的目录 -size -10k(小于10k)  +10k(大于10K) 范围 -size +10k -size +100k

        find 查找的目录 -type 文件类型

        grep -r "查找的内容" +"查找的路径"  在和管道配合使用时可以不加 -r

        grep把要搜索的路径放在后面

16、安装软件

       在线安装 apt-get install ***
      删除 apt-get remove tree
      更新软件列表 apt-get updata
      清理所有软件安装包 apt-get clean /var/cache/apt/archives下面的.deb文件
    
      aptitude 和apt-get类似
    
      已经下载好的安装包(.deb文件)
      sudo dpkg -i 名字   
      sudo dpkg -r 卸载
     
      源码安装
          1、解压缩源代码包
          2、进入到安装目录
          3、检测文件是否缺失  创建Makefile 检测编译环境 ./configure 可能会加参数
          4、make 
          5、make install
          6、看readme

17、U盘的挂载
      1、sudo fdisk -l  查看设备名字
      2、挂载 sudo mount /dev/sdb1 /mnt
      3、卸载 umount  /mnt
18、压缩文件

        tar jcvf 压缩文件名.bz2 要压缩的文件或目录

        tar zcvf 压缩的文件名.gz 要压缩的文件或目录

        tar jxvf 压缩包的名字.bz2
        tar zxvf 压缩包的名字.gz
        加参数-C可以添加目录,解压到那个目录

        c--创建
                x--释放
                v--显示提示信息--可以省略
                f--指定压缩文件的名字
                
                z--使用gzip方式压缩 -- .gz
                j--使用bizp2的方式压缩文件 --.bz2

19、rar压缩和解压缩、
    1)、必须安装该软件
    2)、参数
            压缩 : a
            解压缩 :x
    3)、格式
            压缩rar a 生成的压缩包的名字(后缀不用写) 要压缩的文件或者目录
            解压缩:rar x 压缩文件名  可以跟目录 解压到某个目录
        
20、zip压缩和解压缩
    1)、参数
            压缩目录需要参数-r
    2)、压缩
            zip 生成的压缩包的名字(后缀不用写) 要压缩的文件或者目录

    3)、解压缩
            unzip 压缩包的名字 -d +解压目录
21、ps命令的使用

       ps用于查看进程  加参数 -au 会更加详细

       每启动一个应用程序就是一个进程

       ps x 查看没有终端的应用程序

       Linux下如何切换设备终端:
            Ctrl + Alt + F1-F7

       管道的概念:

              文件过滤 命令1 | 命令2 把命令1的输出作为命令2的输入

22、 kill命令的使用
             kill -l 查看信号
             kill -SIGKILL +进程号或者kill -9 +进程号

23、env 和 top命令
             env查看当前进程环境变量   只输出PATH env | grep PATH
             linux环境变量格式 key = value   每个:都是一个value值
             top打开任务管理器

24、网络相关的:

           ifconfig 查看ip地址

          ping www.baidu.com -c 4  显示四条之后就自动停止
          nslookup 查看服务器域名对应的IP地址  

 25、管理用户

         addusr + 要创建的用户  但是用户名不能有大写

         usradd -s /bin/bash -g Robin -d /home -m 名字

         -s指定什么类型的shell编译器 -g 所属组 -d 家目录 -m就是名字

         先用gropuadd 添加-g后面的组

        删除用户:
              deluser + 用户名,家目录需要手动删除
              userdel -r 用户名 ,家目录可以删掉

26、ftp服务器配置
            1)、先下载 vsftpd
                apt-get install vsftpd
            2)、修改配置文件 /etc/vsftpd.conf
                 anonymous_enable=YES           
                是否允许匿名用户登陆
                write_enable=YES
                实名用户拥有写权限
                local_umask=022  放开
               anon_mkdir_write_enable=YES
               匿名用户可以在ftp上创建文件夹
                service vsftpd restart  重启服务器

27、实名登陆ftp服务器和匿名登陆ftp服务器

        实名登陆:

         客户端:
               ftp + IP(用户名的IP)
               文件的上传,put+文件名,文件必须是你在哪个文件夹下进入的,才能传哪个文件夹下面的东西
              下载 get + 文件名 不能操作文件夹,想要操作就打包

       匿名用户登陆ftp
               1)、在/etc/vsftpd.conf下加anon_root=/home/aston/MyFtp/ =左右不要有空格 /home/aston/MyFtp/是匿名用户的根目录
               2)、ftp + ip 用户名写anonymous (必须) 密码:不写  就进入了匿名进入ftp
               3)、不允许任意切换,在制定范围内工作,需要自己添加匿名用户目录

28、ftp链接ftp
            是一个软件可以链接ftp
            lftp + ip 输入login匿名进入
            lpwd就可以查看在那个目录下进入的ftp,lcd可以更改
            mput可以上传多个
            mirror -R 可以上传目录,文件夹
            mirror 可以下载文件夹

29、ssh

       1)、下载 openssh-server
       2)、远程登录ssh usrName@IP
       3)、退出 logout
30、scp命令
         超级拷贝
              scp -r 目标用户名@目标主机IP:/文件绝对路径   /保存到本机的哪个路径

31、vim中常用的操作

        光标移动    H    J    K    L
                  前    下     上    后
    
       0移动到行首,shift + 4 移动到行尾
       移动到文件头部gg  G文件尾部
       移到某行500G
       删除光标后面的字符 x 删除光标前面的字符 X 
       删除光标前面的单词 dw  删除后面的单词 de
       删光标前的所有d0  后的 shift D
       u是撤销
      Ctrl + r 反撤销
      删除多行ndd

32、vim中的复制和粘贴
       删除的本质是剪切
       p可以在光标下一行进行粘贴
      大写P可以在当前行进行粘贴
      yy是复制 nyy复制多行

33、可视模式和查找
           v进入可视,移动光标就是选中的内容,一个y就是复制 p粘贴
          查找:
           1)/加你要查的东西,n是切换下一个 N是上一个
           2)?也是查找,/是向下查找,?是向上查找
           3)查一个单词出现过多少次:
               光标移动到单词处,#,n切换
       r可以替换当前字符,只能是单个字符
       缩进:
           向右>>向左<<
       shift +k 进入man手册

34、末行模式下的操作
    :s/要替换的字符/用什么替换/ 把当前行的第一个换成你想换的
    :s/要替换的字符/用什么替换/g 文件中所有的
    :20,30s/要替换的字符/用什么替换/ 20到30行的东西    
    
    :!加命令可以操作  例如!pwd

35、分屏操作:

    sp水平分局

    vsp垂直分局

    wqall都关闭

36、gcc的一些参数
    预处理器:cpp 头文件展开,宏替换,注释去掉  gcc -E hello.c -o hello.i
    编译器:  C文件变成汇编文件 gcc -S hello.i -o hello.s
    汇编器:  汇编文件变成2进制文件 gcc -c hello.s -o hello.o
    连接器:  将函数库中对应的代码组合到目标文件中   gcc hello.o -o hello
        
    -o生成另外的名字
    -I 指定头文件目录
    -D编译的时候定义宏
    -O优化程序 -O1(2/3)
    -Wall 输出警告信息
    -g在程序中添加一些调试信息

37、 静态库的制作和使用
    1)、命名规则
        1)、lib+库的名字+.a
        2)、libmytest.a
    2)、制作步骤
        1)、生成.o文件  gcc -c *.c
        2)、将生成的.o文件打包  用 ar rcs 静态库的名字(libmytest.a)+要打包的文件
    3)、发布和使用静态库
        1)、发布静态库
        2)、头文件(包含库里提供了什么函数)
        3)、会给一个测试函数 main.c
            两种使用方法:
                gcc main.c lib/libMycalc.a -o sum
                gcc main.c -Iinclude -L lib -l MyCalc -O myapp
            -I指定头文件目录,-L指定库的目录 -l 指定库的名字 -O 编译生成的名字
            nm .a可以查看静态库里面有什么

38、共享库的制作
    1)、命名规则 lib+名字+.so
    2)、步骤
        生成与位置无关的代码(生成与位置无关的.o)
        将.o打包
    gcc -fPIC *.c就是生成了位置无关代码
                与位置有关每次编译都会把代码放到固定位置
                共享库有一段自己的内存,而且在程序运行起来之后再调用共享库,每次的位置是不一定的
    
    gcc -shared -o 要生成共享库的名字(lib**.so) *.o
    3)、使用
    main.c是测试文件
    gcc main.c lib/lib**.so -o app 
    gcc main.c -Iinclude -L lib -l MyCalc -O myapp
    ./app后会报错
    
    ldd命令查看我们可执行文件所以来的所有的共享库
    把生成的.so拷贝到/lib中,可以成功
    
    LD_LIBRARY_PATH  把库的路径给这个环境变量 本来里面是什么都没有的,给他赋值
    export LD_LIBRARY_PATH = ./lib 是临时的
    
    vi /.bashrc  export LD_LIBRARY_PATH = ./lib 写到最后一行
    
    1)、找到动态连接器的配置文件      /etc/ld.so.config
    2)、动态库的路径写到配置文件中    把目录写入进去
    3)、更新 -- sudo ldconfig -v     

38、gdb调试:

    gdb调试:
    编译一个程序 gcc -o app a.c -g生成的app里面会有调试信息
    gdb app 会进入调试模式
    按l可以查看代码,默认是打开带main.c的
    可以l+文件名
    也可以 l + 文件名:行号
    或者 1 + 文件名:函数名
    b + 行号可以加断点
    条件断点:b 15 if i==15
    查看断点信息 i b
    start启动gdb,但是只执行一步,n单步调试,c是继续执行到断点处
    s进入到函数体内部,l查看函数代码  l+行数打断点 c停到断点处 
    不进入函数体 n
    p+变量名可以查看变量值是多少,数组名也可以
    ptype查看变量类型
    display i 追踪i的值,适用于循环,每次可以打印i的值
    undisplay可以取消追踪,但是要先查看编号 info display 然后 undisplay +编号
    u跳出单次循环
    finish跳出当前函数,前提是要取消断点,del加断点编号
    set var i = 10  当i = 10的时候才看,相当于直接把for循环的值变成了10

39、编写一个简单的makefile      一个规则 两个函数 三个自动变量

    一个规则:模式规则

          模式规则
      %.o:%.c
          gcc -c $< -o $@

        两个函数:

              makefile中所有的函数都有返回值
             1、查找指定目录下,指定类型的文件
             src =$(wildcard ./*.c)
             2、匹配替换函数
             obj = $(patsubset ./%.c, ./%.o, $(src))   把目录下的.c文件切换成.o文件

       三个自动变量: $< 规则中的第一个依赖  $@规则中的目标 $^规则中的所有依赖

       makefile 中的变量
            obj = main.o add.o ...
            target = app
            $(target):$(obj)
            gcc $(obj) -o $(target)

        /makefile中自己维护的变量,都是大写
        CC = cc 就是gcc
        CPPFLAGS = -I     预编译时需要的参数    
        CFLAGS:编译的时候使用的参数  -Wall -g -c
        LDFLAGS:链接库使用的选项

40、makefile 例子:

    target = app
    src =$(wildcard ./*.c) 
    obj = $(patsubset ./%.c, ./%.o, $(src))
    CC = gcc
    CPPFLAGS = -I
    $(target):$(obj)
        gcc $(obj) -o $(target)
    %.o:%.c
        gcc -c $< -o $@    
.PHONY clean 声位为伪目标
clean:
        -rm 前面加-:如果执行失败,继续向下执行
        rm $(obj) $(target) -f 强制执行,存在不存在都执行不报错
hello:
    echo "hello,makefile"

41、C库函数:
    FILE*fp 里面的内容
        文件描述符 int类型 最多打开1021个文件
        文件读写指针位置
        I/O缓冲区(内存地址)
    几种情况把缓冲区里的数据写到硬盘里
        1 刷新缓冲区 fflush
        2 缓冲区已满
        3 正常关闭文件
            1 fclose
            2 retuen (main函数)
            3 exit (main 函数)

42、虚拟地址空间
    程序运行起来就会有一个进程,就会为这个进程分配虚拟地址空间
    0-3G用户区  3-4G内核区 (内存管理 进程管理 设备驱动管理 VFS虚拟文件系统)
        文件描述符就在内核区,里面有一个PCB进程控制块,里面有一个文件描述符的表,是一个数组,大小是0-1023
        默认0-3被占用,STDIN_FILENO  STDOUT_FILENO STDERR_FILENO 标准输入 标准输出 标准错误
        
    0-3G用户区 从下往上
    0-4k被保护区    
    Linux下可执行文件都是ELF格式  
    text代码段
    .data(已初始化全局变量)
    bss(未初始化全局变量)
    堆空间 向上增长
    共享库:里面有C标准库 linux系统io函数
    栈空间 向下增长  
    环境变量
    内核区

 

虚拟地址空间用处:
    1 方便编译器和操作系统安排程序的地址分布
        程序可以使一系列相邻的虚拟地址来访问物理中不相邻的大内存缓冲区
    2 方便进程之间的隔离
        不同进程使用的虚拟地址彼此隔离,一个进程的代码无法更改正在由另一进程使用的物理内存
    3 方便操作系统使用你那可怜的内存
        程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区
    
    读大文件:写到另一个文件
        两种方式,那种更高 
            read write     --每次读一个byte   更改缓冲区大小 也可以和下面的方法效率一样 这个缓存区是我们自己维护的
            getc putc -- 每次读一个byte  --效率高
                标准C库函数有一个缓冲区

43、C库函数与系统函数的关系
    printf函数 ->标准输出(student): FILE*fp
    向下调用Linux系统API 分
    应用层         write(fd,"hello",5)
    系统调用    sys_write向内核操作    
    内核层       设备驱动函数

44、open函数介绍
    man 2 open 
    1)、需要引入的头文件:
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>
    2)、函数原型
        前提是已经存在
        int open(const char *pathname, int flags); 打开文件路径,打开方式  O_RDONLY,  O_WRONLY,  or  O_RDWR.
        
        文件不存在
        int open(const char *pathname, int flags, mode_t mode);想创建的名字  打开方式 O_RDONLY,  O_WRONLY,  or  O_RDWR.还要有一个参数O_CREAT     创建的文件指定一个访问权限 777

    3)、返回值 返回一个新的文件描述符
45、open函数的errno
    定义在头文件 errno.h中 全局变量,任何标准C库函数都能对其进行修改(Linux系统函数更可以)
    
    错误宏定义位置    第1-34个错误定义/usr/include/asm-generic/errno-bash
                    第35-133个错误的定义:/usr/include/asm-generic/errno.h
    
    每个errno值对应着以字符串表示的错误类型
    
    void perror(String s)
    perror 用来将上一个函数发生错误的原因输出到标准设备
    参数s所指的字符串会先打印出来

46、read 和write函数
    read:
        #include <unistd.h>

        ssize_t read(int fd, void *buf, size_t count); 
        ssize_t 是一个int型的数
        -1 读文件失败
        0 文件读完了
        >0读到的字节数
    write
            #include <unistd.h>

            ssize_t write(int fd, const void *buf, size_t count);

47、_lessk函数     
            #include <sys/types.h>
            #include <unistd.h>

            off_t lseek(int fd, off_t offset, int whence);
            off_t offset 文件指针偏移量
            
            SEEK_SET  开始位置
              The offset is set to offset bytes.

            SEEK_CUR 当前位置
              The offset is set to its current location plus offset bytes.
            SEEK_END 尾部

           获取文件长度:
                int ret = lseek(fd,0,SEEK_END); ret就是文件的长度
           文件拓展:
               只能往后拓展
               int ret = lseek(fd,2000,SEEK_END);拓展2000个        
               实现文件拓展还需要实现一步写的操作
               write(fd,"a",1);  

48、stat函数

             参考链接:https://www.cnblogs.com/hnrainll/archive/2011/05/11/2043361.html

49、一些系统文件函数介绍:

    access测试一个文件拥有某种权限  int access(const char *pathname,int mode) ,mode标志 R_OK读权限  W_OK写权限 X_OK执行权限
    Int ret = access(argv[1],W_OK)
    
    
    chmod函数修改文件权限    int chmod (const char *path,mode_t mode);
                            int fchmod(int fd,mode_t mode)
                            
    int ret = chmod(argv[1],0755);
    
    要把传进来的argv改成八进制数 
    用strtol来进行转换
    long int strtol(const char *nptr, char **endptr, int base);

    chown改变文件所有者,现在/etc/passwd 下面查看id            
        int chown(const char *pathname, uid_t owner, gid_t group);
        int fchown(int fd, uid_t owner, gid_t group);
        int lchown(const char *pathname, uid_t owner, gid_t group);

    int ret= chown(argv[1],116,125)
    
    truncate函数 实现文件拓展 
        int truncate(const char *path, off_t length);
        int ftruncate(int fd, off_t length);
    对文件进行截取
    文件长度 100.第二个参数指定长度为20,后面的八十个就没了
    对文件拓展
    文件长度 100.第二个参数指定长度为300,就拓展了
    
    link创建硬链接
    int linkat(int olddirfd, const char *oldpath,
    int newdirfd, const char *newpath, int flags);

    symlink创建软连接
    readlink用来读一个软连接 

50、unlink 创建临时文件
 unlink一个普通文件,如硬链接个数是0,就删除了

    unlink一个文件就是删除一个文件的目录项,并减少它的连接数    
    
    int unlink(const char *pathname)
    打开一个文件,再unlink就会不会删除文件,就会生成一个临时文件,当关闭的时候就会删除文件 
    int fd = open("tempfile",O_CREAT|O_ROWR,0664)
    
    删除临时文件
    int ret = unlink("tempfile")
    但因为文件被open  无法删除,所以可以继续操作
    write(fd,"hello",5);
    
    lseek(fds,0,SEEK_SET)
    char buf[24] = {0}
    read = (fd,buf,sizeof(buf))
    
    write(1,buf ,len )是写到屏幕上?? 1 标准输出 0 标注输入,2标准错误

51、目录操作函数
    rename重命名
       int rename(const char *oldpath, const char *newpath);

    chdir修改文件当前进程的的路径 参数就是一个路径
    
    getcwd获取当前进程工作目录
    mkdir创建目录    
    opendir打开一个文件夹
    opedir _ readdir
    DIR *opendir(const char *name);判断返回值是否是空

    readdir 文件类型文件名经常访问
    struct dirent *readdir(DIR *dirp);
    每读一个都会返回一个记录项
    
    closedir关闭

52、递归目录获取文件个数

int getfileNum(char * root)
	{
		//对当前目录进行遍历
		DIR *dir = NULL;
		dir = opendir(root);
		if(dir == NULL)
		{
			perror("opendir");
			exit(-1)
		}
		//遍历当前打开目录
		struct dirent *PTR= NULL;
		char path[1024] = {0};
		while(ptr = readdir(dir) ! = NULL)
		{
			//判断 过滤掉. h和 ..
			if(strcmp(ptr->d_name,".")==0||strcmp(ptr->d_name,"..") == 0)
			{
				continue;
			}	
			//如果是目录
			if(ptr->d_type == DT_DIR)
			{
			//	递归 读目录
				sprintf(path,"%s %s",root,ptr->d_name);
				total += getFileNum(path);
			}
			//如果是普通文件
			if(ptr->d_type == DT_REG)
			{
				total++;
			}
		}
		closedir(dir);
		
		return total;
	}
int main(int argc,char * argv[])
{
	int total;
	total = get_file_count(argv[1]);
	printf("%s has file numbers %d\n",argv[1],total);
	return 0;
}	

53、dup和dup2
文件描述符复制或分拣描述重定向    

用完dup后一个文件可以对应两个文件描述符
  int dup(int oldfd); 返回没有被占用的最小的文件描述符
  
int dup2(int oldfd, int newfd);  old复制给new
new如果是被打开的 new会被打开
new和old同一个的话没影响,不会关掉new直接返回old

54、functl函数

        参考链接:https://www.cnblogs.com/xuyh/p/3273082.html

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值