APUE筆記之:進(jìn)程環(huán)境詳解
在main中調(diào)用exit(1)和reutrn 1是等價(jià)的。
內(nèi)核啟動(dòng)一個(gè)進(jìn)程的唯一的方法是調(diào)用exec,用戶程序終止進(jìn)程的唯一方法是顯示或者隱式的調(diào)用_exit或者EXIT。
每個(gè)進(jìn)程都會(huì)有一個(gè)進(jìn)程表。進(jìn)程表是一個(gè)全局的指針:environ。extern char **environ可以查看這個(gè)環(huán)境表。另外,可以通過getenv和putenv來獲取修改環(huán)境表。寫個(gè)程序試一下。
linux的段:linux正文段從0X08048000單元開始,棧底則從0xC0000000開始
棧是向下生長,對(duì)向上生長。這里描述的是邏輯地址。
編譯時(shí),gcc -static可以阻止程序使用動(dòng)態(tài)庫,轉(zhuǎn)而使用靜態(tài)庫。
malloc:分配指定字節(jié)存儲(chǔ)區(qū),值不確定。
calloc:原型為void *calloc(size_t nobj, size_t size),分配size*nobj個(gè)字節(jié)。
realloc:更改以前存儲(chǔ)區(qū)的長度。原型:void *realloc(void *ptr, size_t new_size);返回值可能還是原來的地址(如果它的后面有足夠的存儲(chǔ)區(qū)),可能發(fā)生了更改(后面沒有足夠的存儲(chǔ)區(qū),需要申請(qǐng)一塊大的,并且把原先的內(nèi)容拷貝過去)。new_size是新緩沖區(qū)的大小,不是差值。如果ptr為空,則等同于malloc,如果size為0,則等同于free。新申請(qǐng)的東西未初始化。
返回的地址一定是對(duì)齊的,使其可以存儲(chǔ)任何的對(duì)象類型。比如,有些系統(tǒng)要求double類型數(shù)據(jù)的起始地址一定是8的倍數(shù)。
putenv,setenv,unsetenv三個(gè)函數(shù)可以更改進(jìn)程的環(huán)境變量。
setenv:int setenv(const char *name, const char *value, int rewrite)//rewrite:如果已存在是否覆蓋。
putenv函數(shù)直接將入?yún)⒎湃氕h(huán)境表中,而不分配存儲(chǔ)區(qū)。這樣,如果是棧,則會(huì)出錯(cuò)。
setjmp和longjmp是全局的goto,不過盡量不要使用,隱含了很多的陷阱,易出錯(cuò)。
getrlimit和setrlimit可以修改進(jìn)程的資源限制。一起時(shí)用命令來修改,針對(duì)的是所有的進(jìn)程,這個(gè)函數(shù)可以針對(duì)當(dāng)前進(jìn)程。對(duì)應(yīng)的命令式ulimit。
寫測試程序驗(yàn)證:
1、 程序死循環(huán),有printf,前臺(tái)啟動(dòng)和后臺(tái)啟動(dòng)所占用的CPU是否相同?
2、 打開文件,然后關(guān)閉文件,說是用的時(shí)間是否太大。
還好。平均在50us(0.05毫秒)
3、 打開大的文件和打開一個(gè)小的文件,占用時(shí)間是否相同?差別是否大?
打開模式和打開時(shí)間有區(qū)別(下面的代碼:打開文件,寫同樣內(nèi)容):
a+:20us
w+/w:70us
r:20us
r+:20us
打開一個(gè)大文件和打開一個(gè)小文件還是有差別的。
一個(gè)8M,一個(gè)3k,同樣適用a+打開,不寫內(nèi)容:
8M:37us
3k: 12us
一個(gè)8M,一個(gè)3k,同樣適用a+打開,寫內(nèi)容(1K):
8M:60us
3k: 23us
在寫一個(gè)250M文件,差不多也是60us。和8M差別不大。
改用flush后,寫后flush的平均大概在9us。
4、 寫文件:寫相同內(nèi)容,寫到一個(gè)空白文件和寫到一個(gè)大文件中,時(shí)間是否相同?
差不多。
5、 一個(gè)文件,打開,寫內(nèi)容。在進(jìn)程外刪除整個(gè)文件,再寫文件??词裁葱Ч耗芊駥懗晒?,文件會(huì)不會(huì)重新生成,是否會(huì)在關(guān)閉的時(shí)候生成,是否會(huì)返回錯(cuò)誤從而知道文件不存在了,是否可以通過errno獲得這一信息。
目前沒有好的方法,寫的函數(shù)的返回值是成功的,但是文件不存在。目前我的做法是寫的時(shí)候判斷文件是否存在。大約用9us的時(shí)間。這比打開在關(guān)閉要快很多的。
6、 一個(gè)線程順序的寫多個(gè)文件和多個(gè)線程并行的寫多個(gè)文件,同樣的量,花費(fèi)的時(shí)間是否相同?
7、 文件IO的自帶緩存是什么時(shí)候?qū)懙轿募模渴窃谡{(diào)用最后的那個(gè)write函數(shù)?還是在系統(tǒng)內(nèi)部?如果是前一個(gè),則write調(diào)用返回時(shí)間是不一樣的。
欄 目:C語言
下一篇:深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
本文標(biāo)題:APUE筆記之:進(jìn)程環(huán)境詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4530.html
您可能感興趣的文章
- 01-10內(nèi)部排序之堆排序的實(shí)現(xiàn)詳解
- 01-10進(jìn)程間通信之深入消息隊(duì)列的詳解
- 01-10海量數(shù)據(jù)處理系列之:用C++實(shí)現(xiàn)Bitmap算法
- 01-10如何求連續(xù)幾個(gè)數(shù)之和的最大值
- 01-10C++算法之海量數(shù)據(jù)處理方法的總結(jié)分析
- 01-10深入理解c++中char*與wchar_t*與string以及wstring之間的相互轉(zhuǎn)換
- 01-10用代碼和UML圖化解設(shè)計(jì)模式之橋接模式的深入分析
- 01-10C++代碼規(guī)范之命名規(guī)則
- 01-10C語言之free函數(shù)以及野指針介紹
- 01-10C語言小程序 如何判斷兩個(gè)日期之差


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁面的局部加載