今天正式进入linux高级编程的学习阶段
一、什么是linux?
linux是一种操作系统,其最重要的就是linux内核,现在很多操作系统都是基于linux内核进行设计的,linux内核是完全使用c语言进行编写,c语言代码具有高效的运行效率,所以基于linux内核的操作系统常常被用来作为服务器。linux内核的主要功能是:管理CPU,管理内存,管理硬件设备,管理文件系统,以及任务调度。
我们用户在使用linux时,并不能直接操作内核,而是通过shell去间接的操作内核,在这个过程中,shell链接用户和linux内核,防止小白或者误操作导致内核被破坏。同时它也作为一个命令解释器来解释用户的命令给内核。
shell命令有很多,我们在使用时可以通过man手册来查询。
二、shell命令
除了一些基础的shell指令,如:ls,cd,touch,mv,rm等等之外,今天主要学习了关于文件的相关指令。
1.文件查看命令:
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
2.文件查找命令:
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以外的字符
3.whereis
查找指定内容的路径
示例:
whereis 二进制程序名/软件名
3.grep
查找文件中内容
示例:
grep 'printf' /usr/include/stdio.h
3.重定向:
将原本要输出在终端的内容重定向到一个文件中
>> 追加重定向 在原来内容基础上追加新的内容
> 覆盖重定向 将原来的内容覆盖掉
示例:
ls > file.txt
ls >> file.txt
4.管道:
将前面命令的输出作为后续命令的输入
示例:
ps -ef | grep bash
5.其余命令:
ps -ef 查看进程信息
echo 在终端打印内容
du -k/-m 测试文件大小
7.压缩解压命令:
.tar.gz
.tar.bz2
1.压缩命令:
tar -zcvf 压缩文件包名.tar.gz 文件夹
tar -jcvf 压缩文件包名.tar.bz2 文件夹
2.解压命令:
tar -zxvf 压缩文件包.tar.gz
tar -jxvf 压缩文件包名.tar.bz2
6.让虚拟机上网:
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
7.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编程
学习了一些文件操作的shell命令后,正式进入linux高级编程
首先是IO
IO表示输入和输出,主要的操作对象是各种文件,我们在终端输入ls -l指令后会显示出当前路径下各种文件的详细信息:
最开始的一列就是表示的文件类型,linux中主要有其中文件类型,b(block)块设备文件,c(character)字符设备文件,d(directory)目录文件,-(普通文件),l(link)链接文件,s(socket)套接字文件,p(pipe)管道文件
其中普通文件主要是ASSCII文件和二进制文件两种,ASCII码文件时特殊的二进制文件。
linux有两种IO,一个是标准IO,一个是文件IO:
标准IO是库函数
文件IO是系统调用
系统调用:功能强大,应对复杂场景不够灵活
库函数:针对系统调用的封装,使用方便灵活
标准IO可以在Windows或者Linux平台使用
文件IO只能在Linux系统平台使用
标准IO一下接口函数:
fopen/fclose
fgetc/fputc
fgets/fputs
fscanf/fprintf
fread/fwrite
fseek/rewind/ftell
我们要在文件中读写数据时有以下几步:
打开文件 -> 读写文件 -> 关闭文件
要使用标准io接口函数进行操作我们要了解文件流的概念
文件流(stream):流是我们在进行输入输出操作时的一种抽象概念,它具有以下特点:
1.具有方向性(读写)
2.具有连续性
3.具有顺序性
句柄:操作对象的一个抽象
有三个流我们每次在运行程序时都会后台默认进行:
stdin 标准输入流 从终端读取数据
stdout 标准输出流 向终端打印数据
stderr 标准出错流 向终端打印出错信息
我们可以使用fclose关闭这些流,当我们关闭stdout时,printf,putchar等输出函数就会失去作用。
另外学习了标准IO的缓冲机制
#include<stdio.h>
{
printf("hello,world");
while(1)
{
}
return 0;
}
当我们运行程序时,会发现helloworld无法打印出来,这就是缓冲机制。
缓冲机制就是io接口函数在传输数据时并不会立刻就回将数据传输到内核进行执行,而时累计到一定量才进行传输。
有以下几种缓冲:
1.全缓存 大小:4k
缓存区满刷新
刷新条件:
1.缓存区存满刷新(全缓存大小:4096)
2.fflush函数强制刷新
3.程序结束/fclose刷新
与文件建立的缓存
2.行缓存 大小1k
遇到\n刷新
刷新条件:
1.缓存区存满刷新(行缓存大小:1024)
2.遇到\n刷新
3.fflush函数强制刷新
4.程序结束/fclose刷新
与终端建立的缓存 stdin stdout
3.不缓存
直接刷新
缓存区大小 0k stderr
人机交互、界面控制、出错处理
我们也可以通过setvbuf函数来修改io的缓冲类型。