unix c编程:进程环境初解

进程
狭义定义:进程是正在运行的程序的实例
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

进程的概念主要有两点:
第一,进程是一个实体。每个进程都有它自己的地址空间,一般包括文本区(text region)、数据区(data region)和堆栈(stack region)。
文本区域存储处理器执行的代码;
数据区域存储变量和进程执行期间使用的动态分配的内存
堆栈区域存储着活动过程调用的指令和本地变量。
第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行它),它才能成为一个活动的实体,我们称其为进程。
进程是基于多道程序系统的概念,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的,所有多道程序设计操作系统都建立在进程的基础上。

环境变量指针

extern char **environ;  //环境变量
    int i=0;
    char **var;
    for (var=environ; *var!=NULL; ++var){   
        printf("environ[%d] = %s \n", i, *var);
        i++;
    }

申请内存
C语言内存分配方式:
<1>从静态存储区域分配.
内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在. 例如全局变量、static变量.
<2>在栈上创建
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.
<3>从堆上分配,亦称动态内存分配.
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由用户决定,使用非常灵活,但问题也最多.

alloca

void* alloca(size_t); //alloca是向栈申请内存,因此无需释放.几乎不用

malloc

void* malloc(unsigned size); //malloc分配的内存是位于堆中的,并且没有初始化内存的内容

calloc

void* calloc(size_t numElements, size_t sizeOfElement); //位于堆中,将初始化这部分内存为0. 注意:分配空间大小为 numElements*sizeOfElement

realloc

void* realloc(void* ptr, unsigned newsize); //realloc是对malloc申请的内存进行大小的调整

环境变量设置——getenv,putenv,setenv,unsetenv

char *getenv(const char *name); //得到环境变量的值,返回字串指针
int putenv(const char * string); //改变或增加环境变量的内容。

参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。返回值:执行成功则返回0,有错误发生则返回-1。

int setenv(const char *name,const char * value,int overwrite);//改变或增加环境变量的内容

参数 name为环境变量名称字符串。
参数 value则为变量内容。
参数 overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,则改变环境变量原有内容,原有内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
返回值 执行成功则返回0,有错误发生时返回-1。

int unsetenv(const char *name);  //删除name的定义,即使不存在也不算出错。

函数间跳转——setjmp,longjmp
goto语句只能实现函数内的跳跃,函数之间的跳转需要使用setjmp与longjmp

int setjmp(jmp_buf envbuf); //保存当前进程环境,压入栈
void longjmp(jmp_buf envbuf, int val); //执行后跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val。(注意,val即使为0,setjmp返回值也不会为0)

进程资源设定getrlimit,setrlimit
在操作系统中,我们能够通过函数getrlimit()、setrlimit()分别获得、设置每个进程能够创建的各种系统资源的限制使用量。 参见: unix c编程:进程资源控制getrlimit,setrlimit

猜你喜欢

转载自blog.csdn.net/ly601579033/article/details/80909744
今日推荐