5个问题了解进程:
- 什么是程序,什么是进程,有什么区别
- 如何查看系统中有哪些进程?
- 什么是进程标识符?
- 什么叫父进程,什么叫子进程?
- c程序的存储空间是如何分配的?
1.程序是静态的概念,gcc xxx.c -o pro 会生成pro文件,叫做程序(没跑起来)。 进程是程序的一次运动活动,程序跑起来了,系统中就多了一个进程。
2. 使用ps指令,配合grep使用
ps -aux:查看所有进程
ps -aux|grep init:过滤作用,查找init进程
top :类似windows系统进程,动态
3.进程标识符(Process ID)是进程描述符中最重要的组成部分,是在当前 Linux 系统中唯一的一个非负整数,用于标识和对应唯一的进程。
Linux 内核使用了一个数据类型 pid_t 来存放进程的进程标识符,这个数据类型的实质是一个32位的无符号整型数据。
进程标识符 pid=0:对应的是交换进程(swapper)。
进程标识符 pid=1:对应的是初始化进程(init)。
可以使用 getpid 系列函数来获得当前进程的进程标识符。
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
getpid 函数用于获得当前调用进程的进程标识符。
getppid 用于获得当前调用进程的父进程的进程标识符。
4.父进程&子进程:进程A创建进程B,A为父进程,B为子进程
fork函数包含在unistd.h库中,其最主要的特点是,调用一次,返回两次,当父进程fork()创建子进程失败时,fork()返回-1,当父进程fork()创建子进程成功时,此时,父进程会返回子进程的pid,而子进程返回的是0。
转自知乎
如上图所示,当fork()函数调用后,父进程中的变量pid赋值成子进程的pid(pid>0),所以父进程会执行else里的代码,打印出"This is the parent",而子进程的变量pid赋值成0,所以子进程执行if(pid == 0)里的代码,打印出"This is the child"
5.c程序的存储空间分配(代码段、数据段、bss、堆、栈)
栈主要用来存放局部变量, 传递参数, 存放函数的返回地址.
堆用于存放动态分配的对象, 当你使用malloc ,所得到的空间就在堆中。