Linux学习(进程环境)

标题:linux学习(进程环境)–学习UNIX环境高级编程

进程环境问题?
1.main函数是如何调用的。
2.命令行参数是如何传递程序的。
3.典型的存储布局是怎么样的。
4.内存分配方式
5.进程终止的方式。
6.进程的资源限制。

解答问题?
1,2(前两个问题解答)。(2

当内核执行c程序时,再调用main函数前先调用一个特殊启动例程。可执行程序文件将此启动例程指定为程序的起始地址—这是由连接编译器决定的,二连接编译器由c编译器调用。启动例程从内核获取命令行参数和环境变量值,然后调用main函数。

Linux学习(进程环境)

3.存储器分布主要分为五个部分:
正文段(text):里存放的是CPU要执行的指令。
初始化数据段(data):这里存放的是程序中需要明确赋初始值的变量,例如位于所有函数之外的全局变量:int val=1;。
栈:程序函数调用需要保存函数的信息,程序的局部变量。
堆:动态分配的储存空间。
未初始化数据段(bss):这一段中的数据,内核在执行该程序前,将其初始化为0或者null,例如位于所有函数之外的全局变量:int val;
Linux学习(进程环境)

4.分配存储空间的方式:
(1)malloc函数。其原型void *malloc(unsigned int num_bytes);num_bytes是我们要申请内存空间的字节数。并没有对所申请的内存空间进行初始化。
(2)calloc函数,其原型void *calloc(size_t n, size_t size);此函数也是申请堆内存空间的,但是他的用法与malloc不同。比如如果他要申请20个int类型空间,会int *p = (int *)calloc(20, sizeof(int)),减少计算。还有一点就是他将申请的内存空间全部赋值为0.=。
(3)realloc函数和上面两个有本质的区别,其原型void realloc(void *ptr, size_t new_Size);他是增加或减少我们申请的内存空间。ptr是申请空间的首地址,new_Size是扩容之后的空间总大小。当我们扩容的时候,ptr所指向的地址空间高地址有足够的扩容空间,那么将这块空间也申请下来。反之、重新找一块内存空间作为我们原先申请的内存空间+扩容的空间。
注意:我们申请内存的大小一般要比实际分配内存小。多余的这块内存保存我们申请这块空间的信息。

5.进程终止方式及进程如何使用环境变量。(具体看上第一个图)
1.进程终止方式:
正常终止方式
从mian函数返回。
调用exit。
调用_exit,_Exit。
最后一个线程从启动例程返回。
最后一个线程调用pthread_exit。
异常终止方式:
调用abort。
接到一个信号并终止。最后一个线程对取消请求做出相应。
6.进程资源限制。
1.获取和设置资源限制值:
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);
调用上述两个函数都会指定一个资源以及指定下述结构的指针。
struct rlimit{
rlim_t rlim_cur; //软限制
rlim_t rlim_max; //硬限制
}
2.更改资源三条限制规则。
(1).软限制值<=硬限制值。(软限制值更改范围)
(2).硬限制值>=软限制值。(硬限制值更改范围)
(3).只有超级用户才能提高 硬限制值。