unix多用于把進程輸出,unix進程的環境--unix環境高級編程讀書筆記

 2023-11-19 阅读 27 评论 0

摘要:???? 1.進程的啟動 ???? 進程總是從?? main?? 函數開始執行的,main函數的函數原型如下: int main(int argc,char* argv[]); 當內核啟動? c?? 程序時,使用一個?? exec?? 函數。這個?? exec?? 函數就是調用?? main?? 函數之前的一個啟動例程。可執行程序文

???? 1.進程的啟動

???? 進程總是從?? main?? 函數開始執行的,main函數的函數原型如下:

int main(int argc,char* argv[]);

當內核啟動? c?? 程序時,使用一個?? exec?? 函數。這個?? exec?? 函數就是調用?? main?? 函數之前的一個啟動例程。可執行程序文件,將此啟動例程的地址設置為程序的起始地址,這個工作是由連接編輯程序(即編譯器)設定的,這個連接編輯程序在?? linux?? 中就是gcc啦。啟動例程從內核獲取命令行參數和環境變量,然后調用?? main?? 函數。

???? 2.進程的終止

unix多用于把進程輸出、???? 進程的終止方式分為正常終止和異常終止兩種方式,這兩種方式的情況如下:

正常終止
1.從   main   函數返回
2.調用   exit   函數
3.調用   _exit   函數異常終止
1.調用 ? abort ? 函數
2.由一個信號終止
???? exit?? 函數和?? _exit?? 函數用來終止一個程序,它們兩個的區別是,調用?? _exit?? 函數會立即進入到內核,而調用?? exit?? 函數,會先進行一些處理善后工作(如刷新IO),然后調用?? _exit?? 函數進入內核。我們可以使用?? atexit?? 函數來注冊一些終止處理程序,這些終止處理程序在調用?? exit?? 函數時會自動執行,并且先注冊的后執行,后注冊的先執行。一個c程序的啟動和終止的生命周期圖如下:


shell程序設計。c?? 語言的命令行參數,我只前曾經總結過,詳情參考我的另一篇博客點擊打開鏈接。

???? 3.? c程序的存儲空間布局

???? 由于歷史的原因,c程序的存儲空間布局一直是如下的格式:

redis筆記,我們就從下到上一次介紹每一個部分。

???? 正文部分也就是程序體,一般將它設置為只讀的,所以程序的正文是可以被幾個進程共享的。即使對于經常使用的程序,它的程序正文在內存中也只有一個拷貝。初始化數據段用來存儲被賦予初值的全局變量。例如在所有函數之外聲明的變量, int max = 100;就存放在這個區域。未初始化數據段用來存儲未賦予初值的全局變量。例如,函數之外的聲明,long sum[1000];就存儲在這個區域中,在這個區域中的值被初始化為0。堆用來為程序在運行時動態的分配內存空間。棧用來存儲函數中的一些局部變量以及在發生函數調用時,保存現場信息。最上面用來存放命令行參數和環境變量。

???? 說到環境變量就需要提到進程的環境表。以前?? main?? 函數的原型是下面這個樣子的:

int main(int argc,char* argv[],char* envp[]);

第三個參數是傳遞的環境表。但是,后來又添加了一個全局變量用來存儲環境變量,這個變量就是?? environ?? ,它是一個存儲環境表變量指針的數組,并且最后一個元素是NULL。后來發現?? envp?? 參數并不比?? environ?? 簡便。所以,后來的c標準將第三個參數去掉了。但是對于環境變量的存取有幾個函數可以使用:
       #include <stdlib.h>char *getenv(const char *name);

       #include <stdlib.h>int putenv(char *string)

       #include <stdlib.h>int setenv(const char *name, const char *value, int overwrite);int unsetenv(const char *name);

???? 4.存儲器分配

docker進程、

???? 存儲器分配主要涉及到4個函數:

       #include <stdlib.h>void *malloc(size_t size);void free(void *ptr);void *calloc(size_t nmemb, size_t size);void *realloc(void *ptr, size_t size);

這里的函數分配的存儲空間主要是在進程的堆上進行的。malloc?? 函數用來分配一定長度的字節,calloc?? 函數用來為某一對象分配一定個數的空間,realloc?? 用來重新調整已分配的動態內存的大小,free?? 函數用來釋放已經分配的內存的空間。

docker的技術特性。???? 5.setjmp和longjmp

???? setjmp和longjmp函數用來在各個函數之間來回跳轉,相當與是函數之間的goto語句。但是在哥各個函數之間跳轉時,需要注意變量是否回滾。一般來說,需要將變量聲明為?? volatile 為最好,這樣就可以保證變量不會因為?? longjmp?? 而發生回滾。volatile?? 為易失性變量,這樣就保證了,變量一直存儲在存儲器中,從而變量就不會發生變化。

???? 6.共享庫

LINUX教程、???? 共享庫就是把程序可能用到的頭文件,放入到內存的一個共享存儲區中,而不用放到每一個程序文件中。當程序執行時,再動態的鏈接共享存儲區中的內容。這樣就減少了程序正文的長度,但是也相應的加長了程序的執行時間。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/183623.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息