一、main函數。
main函數的原型如下。argc是命令行參數的數目,argv是指向參數的各個指針所構成的數組。
int main(int argc, char *argv[])
當內核執行C程序時(使用一個exec函數),在調用main前先調用一個特殊的啟動例程。可執行程序文件將此啟動例程指定為程序的起始地址,這是由連接編輯器設置的,而連接編輯器則由C編譯器調用。啟動例程從內核取得命令行參數和環境變量,然後為調用main函數做好安排。
啟動例程使得main返回後立即調用exit函數。例如:
exit(main(argc, argv));
二、進程終止。
有8種方式使進程終止。
1、退出函數。
3個函數用於正常終止一個程序:_exit和_Exit立即進入內核,exit先執行一些清理工作然後返回內核。exit總是執行一個標准I/O庫的清理關閉操作:對於所有打開流調用fclose函數。
main函數返回一個整型值與該值調用exit是等價的。
exit(0);
return (0); //兩條語句等價
2、函數atexit。
一個進程可登記至多32個函數,這些函數由exit自動調用。稱這些函數為終止處理函數,並調用atexit函數來登記這些函數。exit調用這些函數的順序與它們登記時候的順序相反。同一函數如若登記多次,也會被調用多次。exit首先調用各終止處理程序,然後關閉(通過fclose)所有打開流。
內核使用程序執行的唯一方式是調用一個exec函數。進程自願終止的唯一方式是顯示或隱式地(通過調用exit)調用_exit或_Exit。進程也可非自願地由一個信號使其終止。
三、命令行參數。
當執行一個程序時,調用exec的進程可將命令行參數傳遞給該新程序。注意:argv[argc]是一個空指針。
1 #include <stdio.h>
2
3 int main(int argc, char *argv[])
4 {
5 int i;
6 for (i = 0; argv[i] != NULL; i++)
7 {
8 printf("argv[%d]: %s\n", i, argv[i]);
9 }
10
11 return 0;
12 }
四、環境表。
每個程序都接收到一張環境表。與參數表一樣,環境表也是一個字符指針數組,其中每個指針包含一個以null結束的C風格字符串地址。全局變量environ則包含了該指針數組的地址。
稱environ為環境指針,指針數組為環境表,其中各指針指向的字符串為環境字符串。通常用getenv和putenv函數來訪問特定的環境變量,而不是用environ,但如果要查看整個環境,必須使用environ指針。
五、C程序的存儲空間布局。
六、共享庫。
共享庫使得可執行文件中不再需要包含公用的庫函數,而只需在所有進程都可引用的存儲區中保存這種庫的一個副本。程序第一次執行或者第一次調用某個庫函數時,用動態鏈接方法將程序與共享庫函數相鏈接。這減少了每個可執行文件的長度,但增加了一些運行時間開銷。
七、函數setjmp和longjmp。
在C中,goto語句是不能跨越函數的,執行這種類型跳轉功能的是函數setjmp和longjmp。這兩個函數對於處理發生在很深層嵌套函數調用中的出錯情況是非常有用的。
八、函數getrlimit和setrlimit。
每個進程都有一組資源限制,其中一些可以用getrlimit和setrlimit函數查詢和更改。進程的資源限制通常是在系統初始化時由0進程建立的,然後由後續進程繼承。每種實現都可以用自己的方法對資源限制做出調整。
相關鏈接