Linux软件编程以及IO输入输出——linux——day1

Linux软件编程以及其IO输入输出

Linux软件编程

linux是操作系统的内核

主要有以下几个功能:

①管理CPU

②管理内存

③管理硬件设备

④管理文件系统

⑤任务调度

shell指令

shell命令主要保护Linux内核(用户和Linux内核不直接操作,通过操作Shell,Shell和内核交互),其次也是命令解释器。

Shell命令:我们可以参考man手册

man 手册(帮助手册)

1.标准命令

2.系统调用

3.库函数

4.设备说明

5.文件格式

6.娱乐

7.杂项

8.管理员命令

c 复制代码
	command [-options] arg1 arg2 .. 

Shell基本命令:

复制代码
    1.ls 
    2.cd 
    3.touch/rm 
    4.mkdir/rmdir 
    5.cp 
    6.mv 

这一块在C语言专栏中已经讲过,这里不再概述。

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 

===============================================================

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是库函数
    文件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缓存:
    缓存分为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只能写入字符
相关推荐
GanGuaGua16 小时前
Linux系统:线程的互斥和安全
linux·运维·服务器·c语言·c++·安全
lsnm16 小时前
【LINUX网络】IP——网络层
linux·服务器·网络·c++·网络协议·tcp/ip
全糖去冰吃不了苦16 小时前
ELK 集群部署实战
运维·jenkins
不掰手腕16 小时前
在UnionTech OS Server 20 (统信UOS服务器版) 上离线安装PostgreSQL (pgsql) 数据库
linux·数据库·postgresql
Lynnxiaowen17 小时前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash
努力学习的小廉17 小时前
深入了解linux系统—— POSIX信号量
linux·运维·服务器
刘一说17 小时前
CentOS部署ELK Stack完整指南
linux·elk·centos
从零开始的ops生活17 小时前
【Day 50 】Linux-nginx反向代理与负载均衡
linux·nginx
IT成长日记17 小时前
【Linux基础】Linux系统配置IP详解:从入门到精通
linux·运维·tcp/ip·ip地址配置
夜无霄17 小时前
安卓逆向(一)Ubuntu环境配置
linux·运维·爬虫·ubuntu