Linux环境下高级编程

Linux软件编程:

1.Linux:
    操作系统的内核
        1.管理CPU
        2.管理内存
        3.管理硬件设备
        4.管理文件系统
        5.任务调度

2.Shell:
    1.保护Linux内核(用户和Linux内核不直接操作,通过操作Shell,Shell和内核交互)
    2.命令解释器

3.Shell命令:
        man 手册(帮助手册)
        1.标准命令
        2.系统调用
        3.库函数
        4.设备说明
        5.文件格式
        6.娱乐
        7.杂项
        8.管理员命令

        command [-options] arg1 arg2 ..

    1.Shell基本命令:
        1.ls
        2.cd
        3.touch/rm
        4.mkdir/rmdir
        5.cp
        6.mv

    2.文件查看命令:
        1.cat
          查看文件内容(字符)

          ASCII码文件(文件内容均是能在终端显示的ASCII码字符)
                .c .txt 文本文件
          二进制文件(文件内容不能够在终端显示,或者显示乱码)
                图片 视频 压缩包

          示例:
            cat filename

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

          示例:
            od -c filename


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

          -n    指定显示的行数

          示例:
            head/tail filename
            head/tail -n 行数 filename

    3.文件查找命令:
        1.find
          查找一个文件的路径

          示例:
            find 文件夹 -name 文件名
            find . -name '*.txt'
            find . -name '??.txt'
            find . -name '[1,2,3,4][1,2,3,4].txt'

        通配符:
            *:匹配任意长度任意字符的文件名
            ?:匹配一位长度任意字符的文件名
            []:匹配一位长度指定字符的文件名
            [1, 2, 3, 4] 指定字符 1 2 3 4
            [1-4] 指定字符 1 2 3 4
            [^2] 指定除了2以外的字符

        2.whereis
          查找指定内容的路径

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

        3.grep
          查找文件中内容

          示例:
            grep 'printf' /usr/include/stdio.h

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

        >>  追加重定向      在原来内容基础上追加新的内容
        >   覆盖重定向      将原来的内容覆盖掉

        示例:
            ls > file.txt
            ls >> file.txt

    5.管道:
        将前面命令的输出作为后续命令的输入

        示例:
            ps -ef | grep bash
    
    6.其余命令:
        ps -ef          查看进程信息
        echo            在终端打印内容
        du -k/-m        测试文件大小
        
    练习:一条shell命令,将/usr/include/stdio.h文件后200行中与extern相关的内容记录到file.txt文件中
        tail -n 200 /usr/include/stdio.h | grep 'extern' > file.txt

    7.压缩解压命令:
        .tar.gz
        .tar.bz2

        1.压缩命令:
            tar -zcvf 压缩文件包名.tar.gz 文件夹
            tar -jcvf 压缩文件包名.tar.bz2 文件夹

        2.解压命令:
            tar -zxvf 压缩文件包.tar.gz
            tar -jxvf 压缩文件包名.tar.bz2

        示例:
            tar -zcvf dir.tar.gz dir
            tar -jcvf dir.tar.bz2 dir

            tar -zxvf dir.tar.gz
            tar -jxvf dir.tar.bz2

    8.让虚拟机上网:
        1.ifconfig
          查看网卡信息

        2.ping www.baidu.com
            64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=51 time=32.7 ms
            64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=51 time=32.7 ms

        3.将虚拟机设置为NAT模式:
            NAT模式:Windows有网,Ubuntu就有网
            桥接模式:Windows和Ubuntu网络独立

            1.点击"虚拟机"
            2.点击"设置"
            3.点击"网络适配器"
            4.选择"NAT模式"
            5.点击"确定"
        
        4.配置Ubuntu系统的IP地址为自动获取IP地址
            1.sudo vim /etc/network/interfaces
              打开网卡配置文件
            
            2.修改文件内容为:
                auto lo
                iface lo inet loopback

                auto ens33
                iface ens33 inet dhcp

            3.保存退出
                ESC
                :wq
            
            4.重启网络服务
                sudo /etc/init.d/networking restart

        5.测试与百度是否连通
            ping www.baidu.com

    9.apt-get工具集:
            1.自动下载软件
            2.能够分析软件的依赖关系

        1.设置apt-get工具的源:
            1.让虚拟机上网
            2.在Ubuntu左侧找到"Ubuntu Software"
            3.在Ubuntu上方找到"Ubuntu Software" 右键选择"Software & Updates"
            4.DownLoad Form 选择 "Others" -> "China" -> "mirrors.aliyun.com"
            
        2.执行命令:
            1.sudo apt-get autoclean
                清除旧源
            2.sudo apt-get update
                更新新源
            3.sudo apt-get install -f
                重建软件源依赖关系
            4.安装软件
                sudo apt-get install wireshark
                安装Wireshark软件

                sudo apt-get install valgrind
                安装valgrind内存泄露检测工具
            5.卸载软件
                sudo apt-get remove 软件名

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

            7.安装
                sudo dpkg -i 软件包名.deb
            
 

在Linux系统中,输入输出是指进程与系统之间的信息传递。当一个程序运行时,它需要从某个位置读取输入信息,经过CPU处理后,将输出显示到屏幕上。这个过程涉及到标准输入、标准输出和标准错误三个流。标准输入(stdin)通常连接键盘,标准输出(stdout)和标准错误(stderr)通常都连接屏幕。

Linux系统中的输入输出可以通过多种方式进行管理,包括重定向、管道和tee命令等。重定向可以将输入或输出重定向到指定的文件或设备,而不是使用默认的标准输入或输出。管道可以将一个命令的输出作为另一个命令的输入,实现信息传递。而tee命令则可以复制前一个进程的输出到指定位置,同时也可以将输出追加到文件中。

总之,Linux系统的输入输出是一种重要的机制,用于实现程序与系统之间的信息交互。通过合理地管理输入输出,可以更好地控制程序的执行过程,提高程序的效率和可靠性。

输入输出流:

输入流和输出流之间的主要区别在于它们在处理数据时的方向和功能。

输入流通常用于从外部源读取数据,例如文件、网络连接或用户输入等。这些流只能读取数据,不能写入数据。输入流在读取数据时,通常会从数据源中读取数据并将其传输到程序或系统的内存中,以便进行处理或存储。

输出流则相反,主要用于将数据写入到外部目的地,例如文件、控制台、网络连接等。这些流只能写入数据,不能读取数据。当使用输出流时,通常会将数据从程序的内存中传输到外部目的地,以便进行存储、显示或发送。

在实际应用中,输入流和输出流的选择和使用取决于具体的需求和场景。例如,在文件读写时,可以使用输入流读取文件内容,使用输出流将数据写入文件。在网络编程中,输入流和输出流用于接收和发送网络数据。在控制台程序中,标准输入流和标准输出流用于读取用户输入和显示程序输出。

需要注意的是,输入流和输出流并不局限于特定的数据类型或格式。它们可以处理各种类型的数据,包括文本、二进制数据等。因此,在使用输入流和输出流时,需要根据具体的数据类型和格式进行处理和转换。

    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是库函数
        文件IO是系统调用

        系统调用:功能强大,应对复杂场景不够灵活
        库函数:针对系统调用的封装,使用方便灵活

        标准IO可以在Windows或者Linux平台使用
        文件IO只能在Linux系统平台使用

    5.标准IO:
        getchar putchar scanf printf gets puts  -> 标准IO

        #include <stdio.h>

        fopen/fclose
        fgetc/fputc
        fgets/fputs
        fscanf/fprintf
        fread/fwrite
        fseek/rewind/ftell

    6.从文件中读写数据的流程:
        打开文件 -> 读写文件 -> 关闭文件
        fopen                   fclose
                    fgetc/fputc     单个字符的读写
                    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

        2.fclose
          int fclose(FILE *stream);
          功能:
            关闭文件,释放文件流指针
          参数:
            stream:文件流指针
          返回值:
            成功返回0
            失败返回EOF(-1)


    8.文件流:
        1.具有方向性(读写)
        2.具有连续性
        3.具有顺序性

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

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

    9.特殊的三个流:
        stdin   标准输入流          从终端读取数据
        stdout  标准输出流          向终端打印数据
        stderr  标准出错流          向终端打印数据

        getchar、scanf、gets 通过stdin来读取终端数据
        putchar、printf、puts通过stdout来向终端输出数据
        perror通过stderr来向终端输出数据

    10.标准IO缓存:

全缓存、行缓存和不带缓存的区别主要体现在IO操作的时机和方式上。

全缓存是在标准IO缓存填满后才进行实际的IO操作,这样可以减少IO操作的次数,提高IO性能。

行缓存则是在输入或输出中遇到新行符时,标准IO库执行IO操作。这种方式适用于需要按行处理输入或输出的应用,例如文本编辑器。

不带缓存的例子是stderr,它不进行任何缓存,当数据产生时立即输出。这种方式适用于需要实时反馈或错误信息的场景。

这三种缓冲模式的选择取决于具体的应用需求和场景。例如,对于需要频繁读写小量数据的场景,全缓存可能不是最优选择,因为每次读写都需要等待缓存填满或清空,可能导致性能下降。而行缓存或不带缓存可能更适合这种场景,因为它们可以在数据产生时立即处理,减少等待时间。对于需要处理大量数据或需要提高IO效率的场景,全缓存可能更加适合,因为它可以减少IO操作的次数,提高数据传输的效率。

        缓存分为3类:
            1.全缓存  4k
                缓存区满刷新
                
                刷新条件:
                    1.缓存区存满刷新(全缓存大小:4096)
                    2.fflush函数强制刷新
                    3.程序结束/fclose刷新

                与文件建立的缓存

            2.行缓存  1k
                遇到\n刷新  

                刷新条件:
                    1.缓存区存满刷新(行缓存大小:1024)
                    2.遇到\n刷新
                    3.fflush函数强制刷新
                    4.程序结束/fclose刷新

                与终端建立的缓存            stdin   stdout

            3.不缓存
                直接刷新

                缓存区大小 0k               stderr

                人机交互、界面控制、出错处理

            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

       注意:
        1.fputc只能写入一个字符,写入多个字符需要多次调用fputc
        2.fputc只能写入字符

fgetc是一个C语言标准库函数,用于从指定的文件流中读取下一个字符。以下是关于fgetc的详细信息:

Fputc

功能

fgetc的功能是从指定的文件流中读取下一个字符,并返回一个无符号字符。如果读取成功,函数返回读取的字符的ASCII码值;如果到达文件末尾或发生错误,则返回EOF。

参数

  • FILE *stream:一个指向FILE对象的指针,该对象指定了一个输入流。

返回值

  • 如果成功读取一个字符,fgetc返回该字符的ASCII码值。
  • 如果到达文件末尾或发生错误,fgetc返回EOF。

示例:读取并显示文件的所有内容

以下是一个简单的C程序,使用fgetc读取并显示一个文本文件的所有内容:

 

c

#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r"); // 打开文件
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
int ch;
while ((ch = fgetc(file)) != EOF) { // 逐字符读取并显示内容
putchar(ch); // 使用putchar打印字符,因为putchar只接受一个字符参数
}
fclose(file); // 关闭文件
return 0;
}

在这个例子中:

  • 首先使用fopen打开文件。如果打开文件失败(例如文件不存在或没有权限),fopen返回NULL,程序将打印一条错误消息并退出。
  • 然后使用fgetc逐字符读取文件内容。当fgetc返回EOF时,表示已经到达文件末尾,循环将结束。
  • 使用putchar函数打印每个读取的字符。注意,putchar只接受一个字符参数,因此在这里使用它比使用printf更合适。
  • 最后使用fclose关闭文件。这是一个好习惯,可以确保所有的数据都被正确地写入文件,并释放与文件相关的资源。
  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值