我要成为嵌入式高手之2月3日Linux高编第一天!!

学习框架

一、IO编程

        多任务编程(进程、线程)

        网络编程

        数据库编程

二、数据结构

学习笔记

Linux软件编程:

一. Linux

        1、Linux: 操作系统的内核,真正的操作系统叫Ubuntu、Redhat、CentOS.....

                内核(纯c实现的代码):管理CPU、内存、硬件设备、文件系统,进行任务调动

                系统调用:Linux内核当中的函数

                应用方向:1、服务器,2、嵌入式

        2、Shell:

                保护操作系统的内核(用户和Linux内核不直接操作)

                命令解释器的作用

        3、工作方式

                用户——>shell——>内核——>硬件设备——>让用户看到现象

我要成为嵌入式高手之2月3日Linux高编第一天!!_第1张图片

 二、man手册(帮组手册)

        1.标准命令

        2.系统调用

        3.库函数

        4.设备说明

        5.文件格式

        6.娱乐

        7.杂项

        8.管理员命令

        command [ -options ] arg1    arg2.....

 三、Shell命令

        1、shell基本命令:ls cd  touch/rm  mkdir/rmdir cp mv

        2、通配符:

                1)*  :匹配任意长度任意字符的文件名

                2)?:匹配一位长度任意字符 ?.h  ???.h

                3)[ ] :  匹配一位指定字符的文件名[1,2,3,4]指定字符1 2 3 4

        3、文件查看命令:

               1) cat:以字符的形式查看文件(cat+文件名)

                        ASCII 码文件(文件内容均是能在终端显示的ASCII码字符)

                        二进制文件(文件内容不能够在终端显示,或者显示乱码)

                2)od -c:以字符或者ASCII码形式显示文件内容

                        示例:od -c filename

                3)head / tail:查看文件开头(末尾)内容,默认10行

                     head -n 想看的前n行

                        示例:head filename

        4、文件查找命令

                1)find:查找一个文件在文件系统当中的路径

                                示例:find  文件夹  -name 文件名

                                可以搭配通配符使用

                2)whereis:查找指定内容的路径

                                示例:whereis 二进制程序名 / 软件名

                3)grep:查找文件中的内容

                                示例:grep 'printf'  stdio.h

          5、重定向:

                将原本要输出内容重定向到在终端的一个文件里

                >>:追加重定向——在原来内容的基础之上追加新的内容

                >  :覆盖重定向——将原来的内容覆盖掉

                示例:

                        ls > file.txt

                        ls >> file.txt

        6、管道

                将前面命令 的输出作为后续命令的输入

                示例:

                        ps -ef | grep bash

        7、其余命令

                ps-ef :查看进程信息

                echo: 在终端上打印内容=printf

                    du: 测试文件大小(仅显示当层文件的大小,不包含下一层的文件)

                                du -k  du -m 按kb和mb测试

        练习:将/usr/include/stdio.h文件后200行中与extern相关的内容记录到file。txt文件中 

 我要成为嵌入式高手之2月3日Linux高编第一天!!_第2张图片

        8、压缩解压命令

                1)压缩命令:

                        tar -zcvf 压缩文件包名.tar.gz 文件夹名

                        tar -jcvf 压缩文件包名.tar.bz2 文件夹名

                2)解压命令:

                        tar -zxvf 压缩文件包名.tar.gz

                        tar -jxvf 压缩文件包名.tar.bz2

                示例:

                        tar -zcvf dir.tar.gz dir

                        .........

        9、让虚拟机上网:

                1)ifconfig:查看网卡信息

                2)ping:从主机向目的地址发送一个信息

                3)将虚拟机设置为NAT模式

                        NAT模式:Windows有网,Ubuntu就有网

我要成为嵌入式高手之2月3日Linux高编第一天!!_第3张图片

                        桥接模式:Windows,Ubuntu都会使用网卡(Windows和Ubuntu网络独立)

我要成为嵌入式高手之2月3日Linux高编第一天!!_第4张图片

                         

                4)配置Ubuntu系统的IP地址为自动获取IP地址

                        1、sudo vim /etc/network/interfaces

                                打开网卡配置文件,设置为

                                # interfaces(5) file used by ifup(8) and ifdown(8)
                                auto lo
                                iface lo inet loopback

                                auto ens33
                                iface ens33 inet dhcp

                        2、重启网络服务

                                sudo /etc/init.d/networking restart

                        3、测试与百度是否连通

                                ping www.baidu.com

                10、在虚拟机上下载软件

                        apt-get 工具集:

                        1)设置apt-get工具的源

                               设置software到“mirrors.aliyun.com”

                        2)执行命令

                                清楚旧源:sudo apt-get autoclean

                                更新新源:sudo apt-get update

                                重建软件园依赖工具:sudo apt-get install -f

                                安装软件:sudo apt-get install wireshark(安装wireshark)

                                                  sudo apt-get install valgrind(安装valgrind内存泄漏监测工具)

                                卸载软件:sudo apt-get remove 软件名

                                查看是否安装成功:dpkg -l 软件名

                                安装:sudo dpkg -i 软件包名

IO:

1、IO输入输出,操作对象是文件

2、Linux文件类型:

        b:block                 块设备文件(按块扫描设备信息的文件)

        c:character           字符设备文件(按字符扫描设备信息的文件)

        d:directory           目录文件(存放文件)

        -:                          普通文件(存放数据,图片,音频,压缩包,文本文件)

        l:link                     链接文件(快捷方式)

        s:socket               套接字文件(用来套接字通信)

        p:pipe                  管道文件(用来进程间通信)

3、普通文件:

        1)ASCII码文件

                文件中所有字符均为能够在终端上显示的字符

                文本文件、程序.c

        2)二进制文件

                文件中存放数据的二进制形式

                图片、音视频、压缩包

        ASCII码文件是特殊的二进制文件

4、标准IO、文件IO:

        标准IO:库函数—针对系统调用的封装,使用方便灵活—Windows、Linux

        文件IO:系统调用—功能强大,应用复杂场景不太灵活—Linux

5、标准IO:

        getchar /putchar /scanf /printf /gets /puts ->标准IO

        fopen / fclose

        fgetc / fputc

        fgets / fputs

        fscanf / fprintf

        fread / fwrite

        fseek / rewind / ftell

6、从文件中读写数据的流程:

        打开文件 -> 读写文件 -> 关闭文件

        fopen         fgetc / fputc    fclose

                        fgets / fputs        字符串的读写

                        fscanf / fprintf     格式化字符串的读写

                        fread / fwrite       二进制文件的读写

7、函数接口:

        1)fopen

                FILE *fopen(const char *pathname, const char *mode);

                功能:打开pathname对应的文件并与其建立一个流

                参数:pathname:要打开文件路径的字符串

                          mode:

                                r:只读(文件不存在报错,文件存在只读打开)

                                r+:读写(文件不存在报错,文件存在读写打开)

                                w:只写(文件不存在创建文件、文件存在将文件内容清空,只写打开)

                                w+:写读(文件不存在创建文件、文件存在将文件内容清空,写读打开)

                                a:追加只写(文件不存在创建、文件存在追加只写打开)

                                a+:追加读写(文件不存在创建、文件存在追加写读打开)

                返回值:

                        成功:返回打开的文件流指针

                        失败:返回NULL

例:

#include 

int main(void)
{
    FILE *fp = NULL;
    
    fp = fopen("a.txt","w+");
    if (NULL == fp)
    {
        printf("fopen failed!\n");
        return -1;
    }
    printf("fopen sucess!\n");

    return 0;
}

        2)fclose(具有free的功能)

                int fclose(FILE *stream);

                功能:关闭文件,释放文件流指针

                参数:stream文件流指针

                返回值:成功返回0;失败返回EOF(-1) 

                注意:

                        一个程序只能 fclose 一次

                        fopen 要和 fclose 成对打开

8、流:

        1)具有方向性(读写)

        2)具有连续性

        3)具有顺序性

       

        句柄:操作对象的一个抽象

        valgrind -- tool=memcheck --leak-chech=full ./a.out

9、特殊的三个流:

        stdin        标准输入流(从终端读取数据)

        stdout      标准输出流(往终端打印数据)

        stderr       标准出错流(往终端打印数据)

getchar 、scanf、gets 都是依赖于stdin来使用

未关闭: 

#include

int main(void)
{
    //fclose(stdin);
    //fclose(stdout);
    //fclose(stderr);

    getchar();
    printf("hello world!\n");
    perror("hello world!\n");

    return 0;
}

 我要成为嵌入式高手之2月3日Linux高编第一天!!_第5张图片

已关闭: 

#include

int main(void)
{
    fclose(stdin);
    fclose(stdout);
    fclose(stderr);

    getchar();
    printf("hello world!\n");
    perror("hello world!\n");

    return 0;
}

我要成为嵌入式高手之2月3日Linux高编第一天!!_第6张图片

10、标准IO缓存(读写的时候才会有缓存)

        缓存分为三类:

                1)全缓存(缓存区满刷新),一般与文件建立的缓存

                        ①缓存区存满刷新(全缓存大小:4096_4k)

                        ②fflush函数强制刷新

                        ③程序结束刷新

                

                2)行缓存(遇到 \n 刷新),一般与终端建立的缓存 (stdin、stdout)

                        ①缓存区存满刷新(行缓存大小:1024_1k)

                        ②遇到 \n 刷新

                        ③fflush函数强制刷新

                        ④程序结束刷新 / fclose刷新

                3)不缓存(stderr)多用于人机交互、界面控制、出错处理

                        直接刷新(0k)

                4)setvbuf修改缓存

                        int setvbuf(FILE *stream, char *buf, int mode, size_t size);
                      功能:
                                改变一个流的缓存类型
                      参数:
                                stream:文件流指针
                                buf:指定缓存空间的首地址
                      mode:
                            _IONBF  不缓存
                            _IOLBF  行缓存
                            _IOFBF  全缓存
                      size:
                            设定缓存区的大小
                      返回值:
                             成功返回0 
                             失败返回非0 

11、fputc
        int fputc(int c, FILE *stream);   

        功能:
                向流中写入一个字符
         参数:
                c:写入字符的ASCII码值
                stream:文件流指针 
        返回值:
                成功返回写入字符的ASCII码值
                失败返回EOF

        注意:

        fputc只能写入一个字符,写入多个字符需要多次调用

        

你可能感兴趣的:(linux,c语言)