1、main函數
原型:int main(int argc, char *argv[]) 其中argc是命令行參數的數目,argv是指向參數的各個指針構成的數組。
main函數的命令行參數代碼如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
int i;
for(i = 0 ; i < argc ; i ++)
printf("argv[%d]: %s\n",i,argv[i]);
return 0;
}
執行樣例:
./7_1_main main test
argv[0]: ./7_1_main
argv[1]: main
argv[2]: test
2、進程終止
正常終止包括:(1)從main返回,(2)調用exit;(3)調用_exit或者_Exit;(4)最後啓動一個線程從其啓動例程返回;(5)最後一個線程調用pthread_exit。
異常終止包括:(1)調用abort();(2)接收到一個信號並終止;(3)最後一個線程對取消請求做出響應。
a、exit函數系列:_exit和_Exit函數立即進入內核,而exit函數則執行清理處理(如關閉標準I/O流,執行各終止處理程序)。在main函數執行return (0)與exit(0)是等價的。
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);
個人認爲使用exit和return比較好。
b、atexit函數
用來登記終止處理程序,一個進程可以登記多達32個函數,這些函數將有exit自動調用,調用順序與登記順序相反,同一個函數可以登記多次,則也會被調用多次。
調用和登記是用棧來存儲的,先進後出原則。
#include <stdlib.h>
int atexit(void (*func) (void))
3、環境表
想得到UNIX環境表的方式如下:
extern char **environ;
while(*environ != NULL)
puts(*environ++);
這樣和在Linux環境下執行env命令得到的結果是一樣的,這裏沒啥好說的。
4、環境變量
由上述的環境表如果想得到某個參數的具體值可以使用如下函數:
#include <stdlib.h>
char *getenv(const char *name); //指向與name關聯的value的指針,若未找到返回NULL
int putenv(char *string); //取形式爲name=value的字符串,將其放到環境表中
int setenv(const char *name, const char *value, int rewrite); //將name設置爲value,若rewrite爲0則不刪除現有的定義,rewrite非0則刪除其現有的定義
int unsetenv(const char *name); //刪除name的定義
int clearenv(void); //刪除環境表中所有項
5、存儲器分配
即動態內存分配,有三個函數:
a、malloc,分配指定字節的空間(常用)
b、calloc,爲指定數量具有指定長度的對象分配存儲空間,該空間中每一位初始化爲0
c、realloc更改以前分配區的長度
#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);//釋放內存空間
6、setjmp和longjmp函數
在C語言中goto語句只能在函數內部跳轉,而setjmp和longjmp可以跨越函數。
#include <setjmp.h>
int setjmp(jmp_buf env);//返回值爲0爲直接調用,從longjmp調用返回爲非0值
int longjmp(sigjmp_buf env, int val);
這裏的例子建議去看教材。
本章最後還有個資源限制,不知爲何物,不說了。