目录
9、进程按照访问属性一致的地址空间存放在一起的原则,分为5个不同的内存区域
头文件unistd.h
1、缓冲区
缓冲区 内核-》屏幕
缓冲区满了 刷新缓冲区
_exit,不刷新缓冲区直接退出,不会输出
exit先刷新缓冲区,再退出进程
2、主函数参数
argc:参数的个数
argv[]:参数内容//打印时,小于参数个数就继续打印
envg[]:环境变量//打印的时候!=NULL就继续打印
路径加名称是主函数的第一个参数
环境变量是从别的地方(父进程)继承过来的,我们只能传递前两个
例如:./main hello abc //就是向主函数传递了两个参数,加上本身的第一个参数路径+名称,一共三个参数
由当前进程产生出来的进程是子进程,环境变量是由父进程继承来的
3、复制进程fork()
fork函数会产生一个新的进程,调用fork的进程为父进程,新生成的进程为子进程,在父进程中返回子进程的pid(唯一标识进程),在子进程中返回0,失败返回-1
父进程和子进程并发运行,一起执行,理论上会让子进程先执行
pid_t pid=fork();
复制进程,从父进程产生新的进程
getpid();//获取pid
fork()执行完之后,子进程才开始执行
4、逻辑地址和物理地址
对于复制的数据,逻辑地址相同,但是物理地址不同,看到打印的地址相同是因为打印的是逻辑地址
在程序中无法直接打印物理地址,也无法直接指定物理地址,因为不知道那一块内存为空
在同一个程序中,逻辑地址和物理地址是同一个地址
如果是两个进程,那么逻辑地址和物理地址不同,因为子进程是从父进程直接复制下来的,所以他们距离起始地址的偏移量是相同的,所以他们逻辑地址相同,打印出来的地址相同,但是实际上,他们占用的是不同的两块内存空间,物理地址不同
5、写时拷贝:
如果多个调用者请求同一份资源,当调用者对于资源不会进行更改时,会共同获取一个指针指向这份资源,直到调用者需要对这份资源进行改变时,才会复制一份资源给这个调用者
6、nm:显示自己定义过的符号
7、代码段从X0804 8000开始
8、数据段从x0804 9000开始
9、进程按照访问属性一致的地址空间存放在一起的原则,分为5个不同的内存区域
代码段:存放可执行文件的操作指令,可执行程序在内存中的镜像,只允许读取,是不可写的
数据段:用来存放可执行程序中已经初始化全局变量,就是放程序静态分配的变量和全局变量
bss段:包含了程序中未初始化的全局变量,在内存bss段全部置零
堆:用来存放进程运行中被动态分配的内存段,他的大小是不固定的,可动用函数分配内存时,新分配的内存就被添加到堆上,当使用函数释放内存时,被释放的内存从堆中剔除
栈:用户用来存放程序临时创建的局部变量,也就是函数中定义的变量,在函数调用时,函数的参数也会被被压入栈,等到调用结束,函数的返回值也被存放在栈中,我们可以把他看成一个寄存、交换临时数据的内存区