• 达内培训课程记录


    ****linux的特性
    开放
    多用户
    多任务
    良好的用户界面
    设备独立性
    丰富的网络功能
    可靠的系统安全
    良好的可移植性

    ****实际操作http://www.php100.com/html/webkaifa/Linux/2009/1106/3485.html命令大全的网站)

    一般共享的文件都挂在在/mnt/下


    tree / -L 2 查看根目录下的2级
    tree  / |less 查看目录树 通过/bin即可查找到bin
    shift + ctrl +N 会弹出一个新的命令行窗口


    akaedu@ubuntu:~$   用户名@计算机名:路径 用户等级提示符

    uname -r  可以查找版本号

    uname -a 内核,操作系统名称,主机名称

    uname -n系统名称

    *******文件和目录的操作命令
    ls命令
    ls -a    显示所有文件包括隐藏文件
    ls -l 列出文件的详细信息
    ls -R 显示目录下所有子目录的文件
    ls -alh 显示文件大小是以k为单位
    man ls 进入命令使用手册,通过j下移,k上移,q退出


    cd 命令
    cd /切换到根目录    ********************(前面有一个/表示绝对路径)
    cd ..切换到上一级目录
    cd ~ 切换到用户目录,回到home目录
    cd -回到切换前的路径


    pwd 当前所在目录

    touch命令(编译文件时会使用)
    功能:创建文件,更新时间戳(根据时间戳记来查看是否编译了)

    使用:touch 文件名

    ln命令
    功能:创建链接
    ln -s才创建软链接
    ln -s 源 目标(源必须是绝对路径)
    (删除以后并不影响源文件)
    例如:ln -s /bin/less /usr/local/bin/less
           ln -s file1 file2 创建硬链接


    man 1 printf系统调用
            2 系统调用
    man 3 open 可以查看库函数
    man -k printf 查到所有函数printf的文件

    尝试使用man /etc/passwd


    cp命令
    功能:copy文件
    cp source target 将文件source复制为target (target可以使路径)
    cp -av soure_dir target_dir 将整个目录复制,两个目录完全一样
    cp -R source_cddir target_dir 将整个目录复制,两个目录完全一样
    **如果复制目录,必须加上-a或-R选项

    rm命令
    rm file删除某一个文件


    mv命令
    mv source target 将文件source更名为target
    也是移动命令


    vim 文件名 编辑文件内容
    之后按Esc键,之后按:wq即可保存退出wim编辑环境

    diff命令
    功能:比较文件内容

    diff dir1 dir2 比较目录1和目录2的文件是否一样


    cat a.txt 查看文件内容

    patch 命令
    打补丁修补文件
    diff a.txt b.txt >patch.txt生成差异文件到patch.txt
    patch a.txt patch.txt 

    grep命令

    在文件中查找相应字符


    mkdir命令
    -p创建子目录
    rmdir test/test2 可以删除子目录

    find命令
    find 路径 -name "文件名"
    find 路径 -name "文件名" -exec grep -inH "关键字" {} ;

    find path -option [-print] [-exec -ok command] {} ;

    chown命令
    改变文件的所有者
    chown akaedu /opt
    chown 用户:组 目录/文件
    chown -R改变目录下所有子目录的所有者


    做开发的一般有个习惯就是把开发相关的放在opt文件,比如kernel文件

    find ./ -name "*.c" -exec grep -inH "main" {};查找main函数的位置


    chmod命令
    改变文件的权限
    chmod 666(用户:组:其他) file ***********将文件file设置为可读写 ******6代表421,即rwx(可读可写可执行)
    x权限表示可不可以进到这个目录,这个文件是否可执行

    tar -cvf <DSTfiler,ame.tar><SRCfilename>压缩文件或目录
    -c创建新的档案文件
    -v详细报告tar处理的文件信息
    -f使用档案文件或设备,这个选项通常是必选的
    -z用gzip来压缩或解压缩文件

    tar命令
    解压缩或压缩文件
    tar -cvf 压缩后的文件名.tar  要压缩的文件名
    tar -cvf 压缩后文件名.tar.bz2  要压缩的文件名
    tar -cvjf 压缩后文件名.tar.gz  要压缩的文件名

    tar -xvjf 解压缩文件名.tar.bz2
    tar -xvzf 解压缩文件名.tar.gz

    自动补全 用TAB命令

    命令别名

    命令历史   方向键可以查看历史上使用过的命令****历史放置的文件在 ~/.bash_history

    通过history来查看使用过的命令
    history -c 清空历史命令
    !数字    用来查找在历史中使用过的命令


    快捷方式
        1.ctrl + U 清空到行首
        2.ctrl + L 清空shell,当前命令变成行首
        3.ctrl + K 清空到行尾


    快速定位

    ******命令的执行次序
    ;  用;间隔的各命令按顺序依次执行
    &&   前后命令的执行存在“逻辑与”关系,只有&&前面的命令执行成功后,它后面的命令才会执行
    ||   前后的命令执行存在“逻辑或”关系,只有||前面的命令失败后,它后面的命令才被执行

    ; 的优先级最低
    ||和&&具有相同的优先级
    可以使用()改变优先级顺序

    *********管道
    将前一个命令的输出传送给后一个命令,作为另一个命令的输入

    方法:命令1|命令2


    *******重定向
    STDIN 0(代号) 标准输入   键盘     命令在执行时所要的输入数据通过它来取得
    STDOUT 1       标准输出   显示器
    STDERR 2

    <  $ ls -l /tmp >mydir 覆盖原来的内容  history >test.txt将历史命令写入到test.txt文件中,若文件不存在则自动创建
    << $ ls -l /etc >>mydir在原来的基础上 cat test.txt >> teat.txt 将test.txt的文件中的内容追加到teat.txt,不存在创建

    cat a.txt || cat b.txt >c.txt 这里如果a.txt存在,则后面的|| cat b.txt>c.txt命令不在执行


    ********su 命令
    变更使用者的身份

    whoami查看当前用户名


    *******sudo命令

    它允许系统管理员分配给普通用户一些合理的“权利”,让它们执行一些只有超级用户或其他特许用户才能完成的任务
    比如:运行一些像mount,halt,su之类的命令,或编辑一些系统配置文件

    ***********ps命令
    用来显示瞬间行程的信息
    pa ux 显示当前用户的进程
    -a 当前终端的进程信息
    -A 当前系统的所有进程信息
    -H 以树形结构显示进程关系
    -u


    通常使用 ps -aux
    (此时,每一行表示的信息,分别如下:
    用户   进程号%cpu的使用率%内存的使用率  虚拟的使用率  实际大小  终端号  状态(s睡眠状态,d不可终结状态,R运行状态 )START开始时间    时间  进程的名称

    **********top命令

    使用top命令后可以查看到的信息如下:
    英文zombie表示僵死的进程
    sy系统所使用时间的百分比
    id空闲率
    toutal 多大的内存
    swap交换空间,类似于虚拟内存
    PID进程Id号
    VURT虚拟内存
    I表示空闲状态
    COMMAND进程名称


    查看系统cpu,内存等使用情况
    -i<时间> 设置间隔时间
    -u<用户名>指定用户名
    -p<进程号>指定进程
    -n<次数> 循环显示的次数


    ps -aux |grep "vim 查看vim的进程

    **********kill命令

    kill 9 11305杀死进程

    *********mount文件系统挂载命令**********做交叉编译的时候会被用到
    功能:文件系统挂载命令

    monut [-t vfstype][-o options] device dir

    注:建立目录用来作挂载点(mount point)
    #mount -t ntfs /dev/sdc1 /mnt/usbhd1

    /mnt通常用来挂载

    umount用来卸载挂载

    *********export命令 ***********export只对当前有效
    功能:设置或显示环境变量

    **echo $PATH可以显示出环境变量
    使用QT时通常要设置QTDIR环境变量
    export PATH=$PATH:/home/cxl/day02/
    echo $PATH*******显示修改后的环境变量
    export PATH=/home/cxl/day02/  ****注意:这里会取消PATH原来的值
    ***************/etc  相关环境变量的配置文件


    语法:export[-fnp][变量名称]=[变量设置值]
    参数:
    -f 代表[变量名称]中为函数名称
    -n删除指定

    pc平台上用gcc做开发
    ARM-linux-gcc编译成arm指令集
    二进制的命令放在环境变量里面

    ********dmesg
    功能:显示开机信息
    -c 显示信息后,清除ring ruffer中的内容
    -s <缓冲区大小> 与设置为8196,刚好等于ring ruffer的大小


    ************************网络命令****************

    ***********ping
    功能:测试与目标主机的连通性
    window会ping4次
    -f 极限检测
    -c 数目 :在发送指定数目的包后停止
             
             ping -c 次数  IP地址

    *************ifconfig
    功能:查看和配置网络设备
    参数:
        up 启动指定网络设备/网卡
        down 关闭指定网络设备/网卡
        inconfig eth0 192.168.255.255
       
    ifconfig 网卡名称  down 关闭网卡
    ifconfig 网卡名称  ip地址  netmask 掩码

    coute add default gw 网关IP

    手动配置ip在首选项的网络连接中,点击Auto eth4 ,点击“编辑”,选择IPV4设置,选择手动,添加IP地址即可

    **************netstat命令
    功能:显示网络连接,路由表,接口状态,网络链路等信息

    -a显示所有选项
    -at 列出所有tcp端口
    -au 列出所有UDP端口
    -lt 列出所有tcp监听的端口
    -lu列出所有的udp监听的端口
    -s列出端口的统计信息

    在使用上面的命令可以查看到:nfs是一种网络文件系统的类型

    ***********telnet命令

    功能:远端登陆

        1.可以通过telnet登陆到开发板,对开发板进行操作
        2.检测某个端口是否开放

    ***********minicom命令
    功能:串口工具

    linux下的minicom的功能与windows下的超级终端功能相似,可以通过串口控制外部的硬件设备,适合在linux通过超级终端进行管理


    ***************cat命令
    功能:文本文件查看和连接工具

    cat a.txt 显示文件内容
    cat a.txt b.txt 将文件a.txt 和b.txt分两行输出
    cat a.txt b.txt -n 将文件内容标号输出

    -n 对输出的文件进行标号
    -b 对非空行进行编号
    -s 有连续的空行,用一个空白行代替

    ==
    *************more命令
    功能:和cat命令一样,都是用来查看文件里的内容,大有所不同的时more命令时按页来查看

    分屏查看内容

    space向下翻页
    b上翻页
    q退出
    *********************less命令
    功能:使用less可以随意浏览文件,而more命令只能向前移动不能向后移动

    进入less中之后可以使用   “/要搜索的内容” 向下搜索
                  “?要搜索的内容”向上搜索

    k 光标上移动
    j光标下移动
    -N 参数N加加行号

    *******************grep命令

    功能:文件搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印在我们的标准输出设备上面

    -i 不区分大小写
    -I 区分大小写
    -c 只输出匹配行的计数
    -H 显示匹配行的文件名和路径
    -n 显示匹配行及行号
    -v 反向(打印所有没有匹配的行)

    ps -aux >test
    grep -n "PID" test


    *****************set命令
    功能:行编辑工具,行为单位进行处理,可以将数据进行替换、删除、新增、选取等特定工作

    a:新增

    ******************wc命令
    功能:统计指定文件中的字节数、字数、行数
    (可以和ls命令结合使用)

    -c统计字节数
    -l统计行数
    -m统计字符数

    ps -aux |wc -l查看当前有多少个任务或进程

    ***********df命令
    检查文件系统的磁盘空间占用情况

    **************vim命令
    功能:一个程序员的文本编辑器

    +t{tag} 被编辑的文件和光标的初始位置

    进入vi filename

    vim-删除、编辑、保存和退出、查找&替换

    Visual mode选择模式

    vim高阶-文件比较、帮助&文档

    配置文件&插件
    1.set mu
    2.syntax on

    ctags插件

    列编辑

    括号&头文件
    *******************************************

    Permission denied表示没有权限
    /usr/bin/remotinatio这个文件没有权限删除

    terminitor安装时使用的命令./setup.py install

    ***********vim编辑器

    u是返回操作,用于操作失误

    *******vim初级》模式

    1.进入vi filename 到一般模式 
    2.输入 iao   插入模式 ESC键回到一般模式
    3. : 进入命令模式 以回车结束运行 回到一般模式(注意退出插入模式之后进入命令模式
    4.输入:wq 退出

    *************vim初级》移动
    h方向左键
    j方向下键
    k方向上键
    l方向右键

    $移动到行尾
    0移动到行首

    H移动到屏幕上端
    M移动到屏幕中央
    L移动到屏幕下端

    :set nu  设置行号 (设置仅对本次有效)
    : set nonu 取消行号
    gg 到第一行
    G 到最后一行
    nG 到第n行
    :n 到第n行

    **********vim初级》删除

    x 删除光标所在处字符
    nx 删除光标所在处后n个字符
    dd 删除光标所在行,ndd删除n行
    D 删除一行中光标以后内容
    :n1,n2d 删除指定位置处的
    ndd删除n行
    ggdG 删除所有行

    **************vim初级》复制&粘贴
    yy、Y 复制当前行
    nyy 、nY复制当前行以下n行
    dd剪切当前行
    ndd剪切当前行以下n行
    P,p 粘贴在当前光标所在行上或行下
    yw 复制单词

    ********vim初级》输入文本
    i进入插入模式
    a在光标后附加文本
    A在本行行、末附加文本
    i在光标之前插入文本
    I在本行开始插入文本
    o在光标下插入新行***********用的比较多
    O在光标上插入新行


    ************vim初级》保存&退出
    :w 保存修改,不退出文件编辑状态
    :wq保存退出
    :w new_filename 另存为指定文件

    ***********vim高级》查找&替换
    /string 向前搜索指定字符串,搜索时忽略大小写:set ic
    n 搜索指定字符串的下一个出现的位置
    N 在关键字向上搜索

    :s/cat/dog 替换当前行中的cat关键字
    :20,25s/cat/dog/g 替换20到25行找到的匹配字符

    ***********vim高级》撤销(在一般模式下操作)
    r取消光标所在处字符
    R从光标所在处开始替换字符,按ESC结束
    u取消上一步操作

    **********vim的另两种模式
    visual mode 即选择模式(注意跟用鼠标选择不同,用v,V,C-v或C-q进入Select mode鼠标选择

    Replace mode 在Normal mode下按R进入,按ESC返回Normal mode


    *************文件比较
    vimdiff (找两个文档中不一样的地方会很方便)

    使用a键可以打开折叠

    ctrl w K(把当前窗口移动到最上边)
    ctrl w H(把当前窗口移动到最左边)
    ctrl w J(把当前窗口移动到最下边)


    *************vim高级》二进制文件

    vim打开二进制文件
    :%! xxd 转换成16进制文件(%号是全局的概念)

    ***************vim高级》标签&分割
    :tabnew创建一个新的标签
    :tabc       关闭当前的tab
    :tabo       关闭所有其他的tab
    :tabs       查看所有打开的tab
    :tabp      前一个
    :tabn      后一个

    tabe filename 新标签打开filename
    tabe .    新标签打开路径
    gt 标签切换

    split filename 以水平分割的方式
    vsplit filename 以垂直分割的方式
    ctrl + hjkl 分割窗口切换
    ctrl  +  +/-/= 调整窗口大小

    ***********帮助&文档

    :h keyword(关键字)进入帮助首页,ctrl+】进行向后移动

    vimtutor

    在插入模式下输入数据,之后在普通模式下使用.即可添加插入状态输入的数据

    ********vim配置

    set nu
    syntax on
    set guifont =DejaVuSansMono12
    set sorttabstop=4
    set guioptions-=T
    set cindent
    set encoding=utf-8
    colorscheme delek

    vim的配置文件~/etc/vimrc

    ****************ctags 插件(行数
    前提用ctags -R文件

    先生成ctags文件,按Ctrl+】就进入到行号的定义中去了
    Ctrl+T返回到上次跳转前的位置
    免去了打开不同的文档,不断查找的麻烦。


    ************折叠&缩进&高亮

    缩进=  gg=G 整个文档进行缩进
    自动补全 光标移动到要补全的 ,在插入模式下,按Ctrl +n

    Text indent
    :set autoindent
    :set smartindent
    :set shiftwidth

    在修改函数时插入模式按Ctrl+N自动补全

    ***************程序员篇*列编辑

    按两次==号就会自定义缩进,程序中代码向后移动
    列的编辑Ctrl+v ,选择要删除的部分之后,按D健就可以删除
    Ctrl+v进入列编辑状态,选择要插入的行,shift+i,ESC键,刚刚选中的就被注释了

    删除列
    1.光标定位到要操作的地方
    2.Ctrl +v进入“可视块”模式,选取这一列进行

    *********************vim程序员篇*括号&头文件
     
    gf跳转到头文件中去  Ctrl +o跳转回来

    %作用:括号匹配
    #
    ;,


    /usr/include/string.h

    Ctrl+G会把当前的文件名打印出来

    *****************GCC的基本特点
    支持多种硬件架构
    x86-64
    Alpha
    ARM
    Motorola 68000
    MIPS
    PDP-10/11
    PowerPC
    System/370-390
    SPARC
    VAX

    gcc编译的代码是在x86系统上运行
    arm-linux-gcov编写的是裸板程序
    arm-linux-gcc hello.c -o hello
    ELF不仅包含数据,还包含头(这个头至关重要,不然开发板不能运行)

    FTP将开发板和PC机连接起来(注意:要配置开发板和PC机的IP地址)

    使用ftp》put hello 将文件放到开发板上面,在root@FriendlyARm plg文件中查找运行

    gcc支持的操作系统
    Unix
    Linux
    BSDAndroid
    Mac Os X
    window

    gcc -v查看gcc的版本信息

    *************嵌入式中的qt
    是一种人机交互界面,说简单点就是一个运行界面!Liunx不像Windows有自己的界面,它的操作主要是命令行模式,就像早期的DOS,Qt就是一个程序,可以更好的实现人机交互控制!

    *************构建过程
    1.预编译 2.编译(.s) 3.汇编 4.链接

    预编译》预编译之后的文件
    编译》生成跟机器相关的汇编文件
    》之后生成机器指令码,即.o文件
    链接》把需要的动态库或静态库包含进来 windows下是PE格式的加载的文    件,linux下是ELF文件


    ***********文件名后缀
    .i 预处理后的c语言源代码文件
    .a 静态库文件
    .so 共享库(动态库)文件(相当于windows系统里的.dll文件)
    .dll(windows系统的库文件)

    编译选项

    -o 指定输出文件(o就是output的意思)
    例如:gcc hello.c -o hello

    -E 预编译,缺省输出到屏幕,用-o指定输出文件
    gcc -E hello.c -o hello.i

    -s编译,将高级语言文件编译成汇编语言文件
    gcc -S hello.c

    -c汇编,将汇编语言文件汇编成机器语言文件
    gcc -c hello.c

    -wall
    gcc -Wall wall.c

    -std 设置C89或C99规范
    gcc -std=C99 werror.c

    -v 查看gcc的版本

    -g产生调试信息
    gcc -g cpp.c


    file 命令查看当前文件的指令格式

    gcc -s生成一个汇编,但是输入是预编译以后的文件


    vim test.c +8 会打开编辑器,并把光标定位到第8行

    gf跳转到相应的头文件

    <>会在编译的环境变量中去搜索


    **************头文件
    类型别名
    外部变量声明
    函数声明
    函数定义不要写在头文件里,但是可以声明

    声明,是声明一个标识的类型,是给编译器使用
    定义,是要分配地址的,不能多次重复定义一个东西
    (例如:c++中的类相当于声明,不分配存储空间)

    gcc math.c alc.c -I

    头文件的系统目录
    /usr/include
    /usr/local/include

    编写文件中最好使用
    #ifdef _ADD_H_
    #define _ADD_H_
    函数声明语句
    #endif

    *********预处理指令

    #undef 删除宏

    #ifdef 如果宏已定义

    #ifndef 如果宏未定义

    #else否则,与#if/#ifdef/#ifndef 配合使用

    #elif 否则如果

    #endif 结束判定

    #error产生错误,结束预处理

    #warning 产生警告,不结束预处理

    #line 指定行号
    #pragma
    设定编译器的状态或指示编译器的操作
    例如
    #pragma GCC dependency "dep.c"
    #pragma GCC poison goto  不能用goto语句,如果编译的过程中有goto语句就会报错
    #pragma pack(1)  对齐操作********下面有演示

    tabe ./adder.h
    定义不要放在.h文件当中


    struct S
    {
        char c1;
        int i;
        char c2;
    };在存储器中存放的字节是12个字节,不符合我们的常识

    #pragma pack(1)可以通过这个语句来设定上面存储结构的对齐方式,要求括号里面的值是2的较小次方


    *************环境变量


    extern int main(int argc,char **argv)
    //这里的argc 参数的个数,argv字符串的指针,指向的是参数的字符串
    {
    }

    作业:
    主函数的原型
    int main(int argc,char * argc[],char * envp[])
    int main(int argc ,char *argv[])
    第一个参数:命令行参数的个数
    第二个参数:字符指针数组,用于存放每个参数
    第三个参数:字符指针数组,表示环境表的首地址

    练习:编写主函数

    $./mychat

    调用是时间的语句如下:
    printf(" tICQ v0.1");
    printf(" Date:");
    printf(__DATE__);
    printf(" Time:");
    printf("__TIME__);
    printf(" ");


    **************GDB程序调试
    GDB作为父进程其doi功能后,创建被调试程序为子程序,通过ptrace系统调用和一系列的信号交互来观察和控制被调试进程的运行,检查和修改其内存环境

    运行程序
    保证程序的正常运行

    ******功能概述

    编译调试程序
    gcc -g hello.c -o hello 生成带调试信息的文件

    GDB启动(有如下四种方式,第四种不常用)
    gdb
    gdb [program_name]
    gdb [pid] 注:pid指的是进程号
    gdb -c [core_file_name]********不常用

    按q即可退出调试界面

    b设置断点
    s或n
    c 跑到下个断点
    info brekpoint 显示设置了多少个断点
    si 进入到程序中去
    p+变量名 把当前变量打印出来
    p+变量名=  即可给变量赋值

    初始化一个结构体

    typedef struct _cmd
    {
        const char *option;
        const char *helpinfo;
        cb_t call_bak;
    }cmd_t;
    #endif

    ! ./cmd在文件中执行外面生成的文件(cmd便是文件名)

    void cmd_help()
    {
        //遍历结构体数组里面的helpinfo
        printf(" <help info> ");
        printf("SYNOPSIS:mychat [OPTION] [IP] ");
        printf("DESCRIPTION: ");
       
        for(i=0;i<cmd_table_num-1;i++)
        {
            printf(" %s ",cmd_table[i].helpinfo);
        }
    }

    const cmd_t
    int main()
    {
        cmd_help();
        return 0;
    }

    tabe ./cmd.h


    *****************************系统调用

    *************date命令  
    查看当前的日期

    ***********time
    real 实际运行时间*******(运行时间通常大于用户态和内核态,因为有等待时间)
    user 用户态
    sys 内核态,内核运行时间,牵涉打印输出,系统调用
    (打印输入输出,linux的驱动的运行就要用到内核态,这时要小心编写程序,不然系统会由于程序错误而崩溃)

    学习linux驱动开发要注意一下的学习
    1.对外提供的借口
    open read close对外提供的借口
    2.驱动之间的资源的竞争
    用什么样的保护机制

    man syscall查看系统调用的命令
    int syscall(int number,...)函数内部有一个很特殊的系统调用号
    tid=syscall(SYS_gettid); SYS_gettid 这是系统调用号
    可以通过man gettid来查看gettid的说明
    man getuid 的用法是获取用户的id(身份证明)

    ********************Unix应用

    Unix/linux系统的大部分功能都是通过系统调用来实现的
    如open.close

    它的系统调用已经封装称函数的形式

    用户态:应用程序(vi.emacs.gftp.firefox等),标准和第三方库(c/c++,Qt,X11等)
    内核态:系统调用(内核提供给外界访问的接口函数,调用这些函数使进程进入内核态),系统内核(驱动程序,系统服务等)

    注:系统调用很好时间

    time a.out 测试应用程序的运行时间分配

    vim /etc/passwd即可打开一个文件,里面包含以下信息:
    用户名,密码,用户的id ,用户组的id ,home目录,shell的环境bash


    man getpwuid 查看获取用户信息的用法

    getpwuid


    *****************文件系统与文件

    存在硬盘上面,***************物理结构:驱动臂,盘片,主轴(寻道用的),磁头(写数据用)

    不同的圆圈叫作磁道
    每个磁道按照512字节等分,叫作扇区

    盘面,磁道,扇区查找到数据的确定位置

    *******************逻辑结构,
    一个磁盘驱动器被划分成一到多个分区,其中每个分区上都有自己的文件系统
    每个文件系统包括:
    1.引导块(计算机加电启动时,ROM BIOS从这里读取可执行代码和数据,已完成操作系统自举),
    2.超级块(记录文件系统的整体信息,如文件系统的格式和大小,i节点和数据块
    的总量,使用量和剩余量等),
    3.若干柱面组,它包括:
    超级块副本,柱面组信息,i节点映射表,块位图,i节点表(存储的是i节点),数据块集


    i节点就是文件的索引节点,访问文件的时候通常要找到该文件的i节点,i节点通过i节点的映射表找到物理位置

    文件名和i节点的对应关系通常记录在文件的目录中,纹路文件中的一条这样的记录就是一个硬连接

    ls -i/etc

    打开文件需要知道文件名和它的路径


    i节点里面的信息:
    文件的类型和权限
    文件的硬链接数
    文件的用户和组
    文件的字节大小
    文件的最后访问时间,最后修改时间和最后修改时间
    文件数据块索引表

    数据块:存储文件的实际内容数据
    文件块:存储普通文件的内容数据
    目录快:存储目录文件的内容数据

    间接块:

    ***文件访问流程

    ***普通文件

    普通文件

    目录文件
    系统要打开一个文件时,会从根目录开始,遍历每一个子目录,查找i节点号,(根节点由于没有父目录,所以它的i节点号会保存在一个固定的位置)

    .和..分别映射文件的本身和它父目录的i节点号

    *************底层库函数

    open 打开并创建一个文件
    creat 建立一个文件
    close
    read 从文件读入数据
    write 对文件写数据
    lseek 在文件中移动读写文件


    **************open函数

    #include<fcntl.h> 其中fcntl 包含control的缩写
    int open(const char *pathname(文件名),int flags(打开的模式,操作方式));
    int open(const char *pathname,int flags,mode_mode);

    int creat(const char *pathname, mode_t mode);

    1.O_RDONLY 另读模式
    2.O_WRONLY 另写模式
    3.O_RDWR  读写模式

    如果没有错误,会返回文件描述(文件描述符是int类型),有错返回-1

    fd标志  文件指针(标志位对应文件指针)
    fd       0  (注:fd占一个字节,0~255,共256)
    fd       1
    fd       2

    文件表中包含:文件状态标志,当前文件偏移量,v节点指针(v节点信息,i节点信息,文件长度..)

    ***********文件读写操作

    使用文件操作函数fopen(),fprintf(),fget()完成如下配置文件的读写
    可以通过cat localuser.ini查看一下内容
    USER=名字拼音


    ************整合文件
    1.定义一个全局字符数组
    2.然后将它返回回来

    *******makefile文件,管理工程

    作者Richard Stallman ,整个gcc就是这个作者编写

    1984年发起GNU计划

    makefile的核心是“文件依赖性”

    makefile的好处是“自动化编译”
    一旦写好后,只需要一个make命令,整个项目完全自动编译,极大的提到了开发效率

    ***********makefile语法规则(尽量将.o文件生成出来)
    根据时间戳记来看文件是否发生了改变

    target .. prerequisites ...
          command
           command   
    target,prerequisites,command组成一个完整的规则
    多个规则组成了makefile

    **************************周四

    man syscallsxitong 系统调用号 getuid
    ret=syscall(366(新增加的系统调用号),100,200(系统调用函数的参数));

    每用open打开文件就会创建一次记录


    makefile文件中
    clean :
        rm -vf *o mychat 这类似于伪指令


    config记录的是哪几项被选中了

    PROG=mychat
    OBJ=main.o cmd.o sysuser.o localuser.o


    #CC=gcc(这样的话,mankefile文件中所有gcc的位置都可以用CC来替代)
    CC=arm-linux-gcc(这里选择相应的硬件平台)
    (注意:以上两行个以决定开发环境)

    $PROG:$OBJ
        gcc -o $PROG $OBJ

    %.o:%.c
        $(CC)-c -o $@ $<
    **********arm-linux-gcc

    ls /opt/FriendlyARM/toolschain/4.4.3/bin/
    如果要编译的话要把上述路径加到环境变量中去

    export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin/
    使用export将它加到环境变量中去,这样就可以使用arm-linux-gcc


    **************make是执行makefile文件

    make会在当前目录下找到名为makefile或Makefile文件
    2.找到文件中的第一个target
    3.递归的检查target的依赖,直到最后一层
    4.如果target不存在或者发生更新,执行后面的指令

    **************进程和线程的基本概念

    运行态的程序称为进程

    进程的分类:
    1.交互式进程(由shell启动,可前台,后台运行,通过终端接收用户的输入)
    2.批处理进程
    3.守护进程


    进程之间有父子关系

    调度进程(PID=0)(注意:从上往下,父进程到子进程)
    init(PID=1)
    xinetd
    in.telnetd       远程登录
    login            用户名/口令
    bash             shell命令
    vi/gcc/a.out/...


    **************fork
    创建子进程

    程序原型如下:
    #include<unistd.h>
    pid_t fork(void)
    成功分别在父子进程中返回子程序的PID和0,失败返回-1


    调用一次会返回两次
    第一次返回子进程的ID
    第二次返回0,子进程创建成功的编号


    子进程是附近成的不完全副本(副本:父进程的拷贝,数据区,DSS区,堆栈区,代码区没有拷,因为他们是公用的

    fork函数成功返回以后,父子进程各自独立运行,它被调用的先后顺序并不确定

    pid_t pid=fork();
    if(pid==-1)
        perror("fork");exit(EXIT_FAILURE);
    if(pid==0)
    {
        子进程执行的代码;
    }
    else
    {
        父进程执行的代码;
    }
    父子进程都执行的代码;

    ************主线程
    从main函数返回就可使函数结束

    ************线程与线程的编程
    线程是程序的执行路线,或者说是进程的子任务
    一个进程可以同时拥有多个线程


    线程是共享进程的所有代码等,唯一有的资源是栈,来保存自己当前的运行状态

    ************POSIX线程
    早起unix厂商各自提供私有的线程库版本
    使用prthread需要包含pthread.h
    同事连一个共享库

    ***********创建一个线程

    #include<prthread.h>

    int pthread create create(prhread_t*thread,(输出线程的id号)
                const pthread_attr_t *attr,(状态,属性)
                  void *(*start_routine)(void*),void*arg);

    成功返回0,失败返回错误码

    start_routine:线程过程函数指针,启动线程其实就是调用函数

    arg:传递给线程过程函数的参数,线程过程函数的调用者是系统内核

    main函数可以视为主线程的线程函数


    fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
        1)在父进程中,fork返回新创建子进程的进程ID;
        2)在子进程中,fork返回0;
        3)如果出现错误,fork返回一个负值;

    #include<pthread.h>

    void *task()
    {
        int i=0;
        for(i=0;i<100;i++)
        {
            printf("子线程 i:%d ",i);
        }
    }

    int main()
    {
        prthread_t prid;
        pthread_create(&ptid,NULL,task,NULL);
       
        int i=0;
        for(i=0;i<100;i++)
            printf("主线程 i:%d ",i);

    }

  • 相关阅读:
    Codeforces 754A Lesha and array splitting (搜索)
    浅入分析Linux
    MakeFile基本使用
    Mac 安装YCM
    Homebrew 配置
    虚拟机复制操作CentOS6导致eth0转为eth0以至于网络服务启动失败的解决方案
    Kickstart安装
    Linux编译安装MySQL
    Python源码读后小结
    编译原理小结
  • 原文地址:https://www.cnblogs.com/xiaoshi-com/p/4832483.html
Copyright © 2020-2023  润新知