Linux | 基础知识+fork()

目录

1. 关于printf 刷缓冲区

2. 主函数的参数(3个)

3. 修炼内功

4. 进程、fork()复制进程(子进程)


1. Windows上用return 0结束程序~ Linux上用头文件stdlib.h中的exit(0)正常退出进程。

2. <unistd.h>为Linux专有的头文件,包含一些可用的函数(如sleep())。

3. 用方向键可以将执行过的指令调出来。

4. 所有的头文件包含在哪里呢? cd/ -> cd usr -> cd include

/bin~命令 /lib库文件 /usr/include头文件

d71388afcd5f4325a35c0f7003e5e51d.png

1. 关于printf 刷缓冲区

分析下面两个程序printf()函数的不同:

2fc8001722714753bb10475344662db1.png

程序1会在打印出Hello World!之后睡眠三秒才结束进程。

fee702249dec4209b76473966193f1f4.png

 程序2会在睡眠三秒后才打印Hello World!结束进程。由于执行printf时将Hello World!放在缓冲区,直到睡眠3秒结束后调用exit(0)程序要结束因此刷新缓冲区才打印出Hello World!

打印:将数据交给内核(操作系统),再由操作系统打印出来。由于我们会不断的进行用户态->内核态的切换,为了减少开销提升效率,因此有了缓冲区的存在。

程序结束exit(0):第一步刷新缓冲区、第二步调用_exit()直接结束进程

printf 刷缓冲区满足条件:

1.缓冲区放满,自动刷缓冲区

2.缓冲区未满,强制刷新缓冲区: \n  或  fflush(stdout)   

2. 主函数的参数(3个)

int main(int argc , char* argv[] , char* envp[])

int argc:参数个数(数组argv[]元素个数)

char* argv[]:参数内容(其中argv[0]=./main 运行程序名)

char* envp[]:环境变量

(1)打印参数个数及内容

4a201b9dec5c43c2b2a5797b9ab799f6.png

ba279c37e7d546728814988aa4a61f6d.png

 (2)打印环境变量(环境变量是从父进程中继承过来的)

由于环境变量末尾为空指针,所以循环条件即为*envp!=NULL

efe363ff51234ea6be0aea34f24828dc.pngcb9f7c0fa81a49edb3d9d70cd63b5194.png

环境变量中有PATH,打印环境变量:echo $PATH

3. 修炼内功

1.冯诺依曼体系将计算机分成了五大部件:运算器、控制器、存储器、输入设备、输出设备。

2.CPU集成了运算器和控制器。

3.存储器~内存(RAM,易失性:一旦关机、断电即消失)。硬盘~I/O设备。

eg:main.c在磁盘(硬盘)中存放、编译后的可执行程序main也在磁盘中。 执行程序./main:将磁盘中的main通过总线传输到内存中并占用部分空间,执行完后内存空间释放。

程序:由一条条指令构成;进程:正在执行的程序。

4.内存由内核(操作系统)来管理。

操作系统:管理计算机上的软硬件资源(主要管理内存、进程、文件),为用户提供交互的接口。

操作系统通过进程控制块PCB(实际为一个结构体struct,其中pid进程号唯一标识一个进程)来管理进程(进程三状态:就绪、运行、阻塞)。 

struct task_struct

{

        int pid; //唯一标识一个进程的进程号

        int status; //进程当前所处的状态:就绪、运行、阻塞

        //.....

{

Windows上的可执行程序为PE格式,Linux上为ELF格式。

5.如何管理内存?

页表:记录物理页(内存,4K、4K划分)和逻辑页的对应关系,即页号对应物理块号。

c4b6ae6134b7498dab3562bf1b9002d8.png

3eff4af84f644b248ac52e31b74ffd73.png通常逻辑页首页地址不为0。

对应关系不是固定的,每次在分配(运行程序)的时候是操作系统看内存哪里有位置就分配。

调试程序时看到的地址均为逻辑地址!是由于我们不知道物理内存哪里是空闲的,所以无法直接指定使用物理内存。

问:如何根据逻辑地址对应物理地址(逻辑页->物理页)?     通过页表:1.找对应关系(页号~物理块号);2.根据页面偏移量(即物理块偏移量)计算确定。

4. 进程、fork()复制进程(子进程)

1)父进程中执行fork()复制当前进程(父进程)的PCB,但进程号pid不同

2)子进程从fork()语句后接着往下执行,父进程也从fork()返回处接着往下执行。

注意:唯一区别为fork()返回值。

父进程中:fork()返回值为子进程的id号。

规定子进程中:fork()返回值为0。

25813a7d0bbd4810bbd9c67861ac9518.png7baefb9a69124b2295f7fc03ad366405.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux是一种开源、免费的操作系统内核,由 Linus Torvalds 在1991年创建。它以其稳定性、安全性和高度可定制性闻名,并在服务器、超级计算机和嵌入式系统等领域广泛应用。以下是 Linux 平台的一些基础知识: 1. **内核与用户空间**: - 内核:Linux的核心部分,负责处理硬件、安全管理、进程管理等核心任务,运行在系统最低权限级别。 - 用户空间:应用程序和用户接口运行的地方,相对于内核更安全,有独立的内存空间。 2. **文件系统**: - Linux 使用多种文件系统,如 ext2、ext3、ext4、XFS、Btrfs等,用于存储数据和组织目录结构。 3. **命令行界面(CLI)**: - 常用的有 Bash shell(基于 Bourne Again Shell),提供强大的文本交互环境。 - 可以通过命令行执行各种操作,包括文件管理、系统配置和网络管理等。 4. **进程与线程**: - 进程是程序在系统中运行的一个实例,而线程是进程中的轻量级执行单元。 - Linux 支持多任务和并发,使用 fork() 和 exec() 函数创建和切换进程,以及 pthread_create 创建线程。 5. **软件包管理**: - 主要的包管理器有 apt(Debian/Ubuntu)、yum(Red Hat/CentOS)、zypper(SUSE)等,用于安装、更新和管理软件。 6. **版本控制系统**: - Linux 开发者广泛使用 Git 进行代码管理,提供分支管理、合并冲突解决等功能。 7. **网络配置与服务**: - Linux 提供丰富的网络工具,如 ifconfig、iptables等,配置和管理网络连接。 - 包括 TCP/IP 协议栈、DNS、NTP 等服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值