examine the environment of a single process
* process terminated
exit() ---- cleanup the resource and end ( ISO C )
_Exit() ---- kernel func ( ISO C )
_exit() ---- POSIX 1 ( kernel func )
*shared libraries
cc -static hello1.c
prevent gcc from using shared libraries
$ size a.out
text data bss dec hex filename
872 256 4 1132 46c a.out
* memory Layout
High Addr | ----------------- cmd args & env args
| ----------------- Stack
|
| ----------------- Heap
| ----------------- Unitialized data (BSS)
| ----------------- Data Segment (Inital)
Low Addr | ----------------- Text Segment
* memory allocation
#include <stdlib.h> void *malloc(size_t size); void *calloc(size_t nobj, size_t size); void *realloc(void *ptr, size_t newsize);
1) But if there isn't room at the end of the existing region, realloc allocates another area that is large enough
2) The allocation routines are usually implemented with the sbrk(2) system call
sbrk() will expands (or contracts) -> the heap of the process
3) Writing past the end or before the beginning of a dynamically-allocated buffer
can corrupt more than internal record-keeping information.
All three return: non-null pointer if OK, NULL on error
void free(void *ptr);
alloca() ----> the memory is allocated from the stack frame of the current function.
* setjmp and longjmp