一、Linux系统编程框架
Linux 系统编程也叫Linux 下的高级编程是介于应用层和驱动层之间的,使用内核向用户提供的接口,来实现实现对文件的增删改查
Linux系统编程的基本框架
#include<stdio.h>
int main(int argc,char*argv[]){
/*
argc:表示输入的参数个数
argv:表示命令行中的参数(在命令行中,一个个指令就是用字符串表示)
*/
int i;
printf("argc is %d\r\n",argc);
//打印命令行输入的有几个参数
//将输入的参数给打印出来
for (int i = 0; i < argc; i++)
{
printf("argv[%d] is %s\r\n",i,argv[i]);
}
return 0;
}
运行结果
二、标准IO和文件IO
- 文件IO就是直接调用系统内核提供的系统调用函数
- 标准IO就是间接调用系统调用函数是C库函数
文件IO 是直接调用内核提供的系统调用函数,头文件是unistd.h,标准IO 是间接调用系统调用函数,头文件是stdio.h,文件IO 是依赖于Linux 操作系统的,标准IO 是不依赖操作系统的,所以在任何的操作系统下,使用标准IO,也就是C 库函数操作文件的方法都是相同的。
对于文件IO 来说,一切都是围绕文件操作符来进行的。在Linux 系统中,所有打开的文件都有一个对应的文件描述符。文件描述符的本质是一个非负整数,当我们打开一个文件时,系统会给我们分配一个文
件描述符。
三、虚拟地址空间
虚拟地址空间是不存在的,它是为了解决内存加载(比如内存有4G、但是有三个应用程序1、2、2G怎么样把应用程序加载到内存中)、栈堆模型(内存本质是物理的颗粒,需要实现堆栈等模型需要)等问题而出现的
- 虚拟地址是为了解决程序加载到内存中会出现的问题
- 虚拟地址的内存大小是由于CPU决定的,32位的处理器就是2^32次方=4G
- 虚拟地址空间是为了解决内存加载、栈堆模型等问题
- 虚拟地址最终会被MMU(内存管理单元)映射到物理内存上,实际上不会占用物理内存4G
- 堆空间一般要比栈多
3.1 程序和进程
-
程序(Program):
- 程序是为实现特定目标或解决特定问题而用某种计算机语言编写的命令序列的集合。这些命令序列可以被计算机理解并执行。
- 程序是静态的,它存储在某种介质(如硬盘、光盘等)上,并包含了一系列指令和数据。
- 编写程序需要一定的编程知识和技巧,通常使用高级编程语言(如C、Java、Python等)进行编写。
- 程序的执行需要操作系统的支持,操作系统负责加载程序到内存中,并为其分配必要的资源。
-
进程(Process):
- 进程是程序在计算机上的一次执行活动。当程序被加载到内存中并由操作系统调度执行时,它就变成了一个进程。
- 进程是动态的,它拥有独立的内存空间和系统资源,并在CPU上执行。
- 一个程序可以对应多个进程,特别是在多用户或多任务操作系统中,多个用户可以同时运行同一个程序的不同实例,每个实例都是一个独立的进程。
- 进程的状态会随着其执行和操作系统的调度而发生变化,如就绪、运行、阻塞等。
- 进程之间通过操作系统提供的机制进行通信和同步,以确保资源的正确分配和程序的正确执行。
总结来说,程序是静态的指令和数据集合,而进程是程序在计算机上的一次动态执行活动。程序是进程的基础,而进程是程序在计算机系统中的具体表现。
程序:磁盘上的代码;进程:加载到内存中的代码
程序和可执行文件(都是文件只占用磁盘的空间):是不占用内存空间的,只占用磁盘空间
程序运行起来时,操作系统会为程序的运行分配一些资源,操作系统会创建一些进程;进程就是正在运行的程序,会占用内存空间
3.2 文件描述符
文件描述符是在内核空间的进程管理空间内;PCB进程控制块就是管理一些进程信息,它是一个复杂的结构体,在这里面有一个文件描述符表它是一个数组
文件描述符就是一个数组,通过文件描述符来定位磁盘上的文件,一个进程可以打开多个文件(所以在进程控制块里面文件描述符一般是以数组的形式存在)&#x