标签:
在学习进程控制相关知识之前,我们需要了解一个单进程的运行环境。
本章我们将了解一下的内容:
?
main函数声明:
int main (int argc, char *argv[]);
参数说明:
main函数启动前:
?
一共有8中终止进程的方式,5种正常终止和3种异常终止。
5种正常终止:
3种异常终止:
启动地址(start-up routine)同样也是main函数的返回地址。
要获取该地址,可以通过以下的方式:
exit (main(argc, argv));
?
函数声明:
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);
函数细节:
返回一个整数和调用exit函数,并传入该整数的作用是相同的:
exit(0);
return 0;
?
函数声明
#include <stdlib.h>
int atexit(void (*func)(void));
函数细节
?
?
#include "apue.h"
?
static void my_exit1(void);
static void my_exit2(void);
?
int
main(void)
{
? ? if (atexit(my_exit2) != 0)
? ? ? ? err_sys("can‘t register my_exit2");
?
? ? if (atexit(my_exit1) != 0)
? ? ? ? err_sys("can‘t register my_exit1");
? ? if (atexit(my_exit1) != 0)
? ? ? ? err_sys("can‘t register my_exit1");
?
? ? printf("main is done\n");
? ? return(0);
}
?
static void
my_exit1(void)
{
? ? printf("first exit handler\n");
}
?
static void
my_exit2(void)
{
? ? printf("second exit handler\n");
}
?执行结果:
?
#include "apue.h"
?
int
main(int argc, char *argv[])
{
? ? int ? ? i;
?
? ? for (i = 0; i < argc; i++)? ? ? /* echo all command-line args */
? ? ? ? printf("argv[%d]: %s\n", i, argv[i]);
? ? exit(0);
}
执行结果:
?
?
每个程序会接受一个环境变量列表,该列表是一个数组,由一个数组指针指向,该数组指针类型为:
extern char **environ;
例如,如果环境变量里有5个字符串(C风格字符串),如下图所示:
典型的C程序的内存布局如下图所示:
上图说明:
?
有三个函数可以用于内存分配:
函数声明:
#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);
void free(void* ptr);
函数细节:
?
环境变量的字符串形式:
name=value
?内核不关注环境变量,各种应用才会使用环境变量。
获取环境变量值使用函数getenv。
#include <stdlib.h>
char* getenv(const char* name);
// Returns: pointer to value associated with name, NULL if not found
修改环境变量的函数:
#include <stdlib.h>
int putenv(char* str);
int setenv(const char* name, const char* value, int rewrite);
int unsetenv(const char* name);
?函数细节:
?修改环境变量列表的过程是一件很有趣的事情
从上面的C程序内存布局图中可以看到,环境变量列表(保存指向环境变量字符串的一组指针)保存在栈的上方内存中。
在该内存中,删除一个字符串很简单。我们只需要找到该指针,删除该指针和该指针指向的字符串。
但是增加或修改一个环境变量困难得多。因为环境变量列表所在的内存往往在进程的内存空间顶部,下面是栈。所以该内存空间无法被向上或者向下扩展。
所以修改环境变量列表的过程如下所述:
?
本篇介绍了进程的启动和退出、内存布局、环境变量列表和环境变量的修改。
下一篇将接着学习四个函数setjmp、longjmp、getrlimit和setrlimit。
?
?
参考资料:
《Advanced Programming in the UNIX Envinronment 3rd》
UNIX高级环境编程(8)进程环境(Process Environment)- 进程的启动和退出、内存布局、环境变量列表
标签:
原文地址:http://www.cnblogs.com/suzhou/p/4319166.html