1. 进程替换
- fork+exec是系统创建新进程的一种方式。
- exec替换之后子进程的id号不变,父进程也不变,PCB也不变,只替换了进程实体。
2. exec系列替换方法
2.1 execl
int execl(const char *pathname,const char*arg,.../*(char*)NULL*/);
2.2 execlp
int execlp(const char*file,const chat*arg,...,/*(char*)NULL*/);
2.3 execle
int execle(const char *pathname,const char*arg,...,/*,(char*)NULL,char*const envp[]*/);
2.3.1 自定义环境变量
2.4 execv
int execv(const char *pathname,char* const argv[]);
2.5 execvp
int execvp(const char *file,char *const argv[]);
2.6 execve
int execve(const char *pathname,char *const argv[],char * const envp[]);
3. 从进程的视角看堆区内存申请与释放的有关问题
- (1) c 语言中所谓的内存泄漏问题
- (2) malloc 申请一块空间,直到进程结束都没有释放,是否产生内存泄漏?
- (3) malloc 申请 1G 的内存空间是否能成功?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
char * s = (char*)malloc(1024*1024*1024);
if(s==NULL)
{
printf("malloc failed\n");
exit(1);
}
memset(s,0,1024*1024*1024);
exit(0);
}
- (4) 在物理内存只有 2G 的系统中,malloc 能否申请 2G 空间,怎么思考?
malloc申请1G内存的时候系统可以提供,所以直接分配;malloc申请2G时候也可以,物理内存是2G,如果物理内存不够,可以引入虚拟内存。 malloc申请3G内存的时候,不可以,因为在32位操作系统上面,物理内存只有4G,而内核占了1给,除去代码区,数据区,栈区以外,堆区最大内存小于3G,所以申请3G内存会失败。
虚拟内存
- (5) malloc 与 fork,父进程堆区申请的空间复制后,子进程也会有一份,也需要释放?
|