一、进程
程序是静态的概念,gcc xxx.c -o pro,磁盘中生成pro文件,叫做程序
进程是程序的一次运行活动,是动态的概念。通俗点意思就是程序跑起来了,程序就多了一个进程。
二、linux系统查看进程
1.使用ps指令查看进程
实际工作中,配合grep来查找程序中是否存在某一进程。
ps -aux|grep xxx
2.使用top指令查看,类似Windows任务管理器
进程标识符
每一个进程都有一个非负整数表示唯一ID,叫做pid,类似身份证
编程调用getpid函数获取自身的进程标识符,getppid用来获取父进程的进程标识符。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = getpid();
printf("my pid is %d\n",pid);
return 0;
}
三、父子进程
进程A创建了进程B,则A为父进程,B为子进程,父子进程是相对的概念。
四、C程序存储空间分配
当c程序执行后,会被加载到内存内,布局如图,分为正文段、初始化数据段、非初始化数据段、堆、栈、,下面来说明这几个部分代表什么:
正文段:由CPU执行的机器指令部分,c语言代码(例如流程控制,算法等)编译成机器指令存放在这个区域。
初始化数据段:此段为数据段,包含程序中明确赋初值的变量。
非初始化数据段:通常称为bss段,内核将此段中的数据初始化为0或空指针。出现在任何函数外的C声明
int array[100];
使此变量存放在非初始化数据段中。
栈:自动变量以及,每次函数调用时所需保存的信息都存放在此段中。每次调用的函数所返回的地址以及环境信息都存放在栈中。之后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。此方式可以递归调用C函数。每次递归时,就会使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。
堆:进行动态存储空间分配。
注意:全局变量和局部变量存储在数据段中,而局部变量存储在栈中。