Linux進程環境

一 main函數

當內核使用一個exec函數執行C程序時,在調用main函數之前先調用一個特殊的啟動例程,可執行程序將此例程指定為程序的起始地址。啟動例程從內核獲取命令行參數和環境變量,然后為調用main函數做好準備。

二 進程終止
進程終止的方式有8種,前5種為正常終止,后三種為異常終止:
1 從main函數返回;
2 調用exit函數;
3 調用_exit或_Exit;
4 最后一個線程從啟動例程返回;
5 最后一個線程調用pthread_exit;
6 調用abort函數;
7 接到一個信號并終止;
8 最后一個線程對取消請求做出響應。
(1)exit函數
#include <stdlib.h>
void exit( int status );
void _Exit( int status );
#include <unistd.h>
void _exit( int status );
這三個函數用于正常終止一個程序,_exit和_Exit立即進入內核,而exit則要先做一些清理工作(調用執行各終止處理程序,關閉所有標準I/O流),再進入內核。三個函數所帶的整型參數稱為終止狀態或退出狀態,如果(a)調用這些函數不帶參數,(b)main函數中的return語句無返回值,(c)main函數沒有聲明返回類型為整型,則進程的終止狀態是未定義的。main函數返回一個整型值與用該值調用exit是等價的。
(2)atexit函數
#include <stdlib.h>
int atexit( void (*fun)( void ) );
一個進程可以登記32個函數,這些函數由exit自動調用,這些函數被稱為終止處理函數,atexit函數可以登記這些函數。exit調用終止處理函數的順序和atexit登記的順序相反,如果一個函數被多次登記,也會被多次調用。

三 環境表
每個程序都會收到一張環境表,環境表是一個字符指針數組,每個指針指向一個以NULL結尾的環境字符串,環境指針environ是一個全局變量,指向指針數組的地址。通常用getenv和putenv函數來訪問特定的環境變量,而不是environ全局變量。如果要查看整個環境,則必須用environ全局變量。

四 C程序的存儲空間布局
1 正文段
CUP執行的機器指令部分,是共享和只讀的。
2 初始化數據段
又稱作數據段,包含了程序中明確需要賦初值的變量。
3 非初始化數據段
在程序開始執行前,內核將此段中的數據初始化為0或空指針。
4 棧
自動變量以及每次函數調用時所需保存的數據都存放在此段中。
5 堆
用于動態存儲分配。堆位于棧和非初始化數據段之間。

五 存儲器分配
#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 );
malloc函數分配指定字節數的存儲區,該存儲區中的初始值不確定;calloc函數為指定數量且指定長度的對象分配存儲空間,該空間中的每一位都初始化為0;realloc函數更改存儲區的長度(增加或減少),新增區域內的初始值不確定,如果ptr為空,realloc和malloc的功能相同。
以上函數的大多數實現所分配的存儲空間都比所要求的大一些,額外的空間用來存儲管理信息。如果在一個超過已分配區的尾端進行寫操作,就會重寫下一個分配區的管理記錄;同樣,在一個已分配區的起始位置之前寫入,會重寫本分配區的管理記錄。這種錯誤是災難性的,但因為不會很快暴露出來,所以很難發現。

六 環境變量
環境字符串的形式如:name=value,它們的解釋完全取決于各個應用程序,而與內核無關。
#include <stdlib.h>
char *getenv( const char *name );
int putenv( char *str );
int setenv( const char *name, const char *value, int rewrite );
int unsetenv( const char *name );
getenv函數返回指向name=value中的value的指針;putenv函數把字符串name=value放入環境表中,如果name已經存在,則先刪除原來的定義;setenv函數將name設置為value,如果name存在且rewrite非0,則刪除其現有定義,若rewrite為0,則不刪除其現有定義;unsetenv函數刪除name的定義,即使不存在也不會出錯。

七 setjmp和longjmp
#include <setjmp.h>
int setjmp( jmp_buf env );
void longjmp( jmp_buf env, int val );
setjmp和longjmp函數用于處理發生在深層次函數調用中的出錯情況,longjmp函數可以在棧上跳過若干個調用幀,返回到當前函數調用路徑上的某個函數中。在希望返回到的位置調用setjmp,數據類型jmp_buf是某種形式的數組,存放在調用longjmp時能用來恢復棧狀態的所有信息。因為需要在另一函數中引用env變量,所以將env定義為全局變量。當檢查到一個錯誤時,調用longjmp函數,第一個參數env就是在調用setjmp時所用的env,第二個參數val非0,它將成為從setjmp處返回的值。使用第二個參數的原因是一個setjmp可以對應多個longjmp,這樣就可以根據返回值來判斷造成返回的longjmp函數在那個函數中,從而確定出錯的位置。

八 getrlimit和setrlimit函數
#include <sys/resource.h>
int getrlimit( int resource, struct rlimit *rlptr );
int setrlimit( int resource, const struct rlimit *rlptr );
getrlimit和setrlimit函數用于獲取或設置進程的資源限制。資源限制通常是由進程0建立的,由每個后續進程繼承。更改資源限制時,注意以下三條規則:
1 進程的軟限制值只能小于或等于硬限制值;
2 任意進程都可以降低其硬限制值,但它必須大于或等于其軟限制值,這種操作對普通用戶是不可逆的;
3 只有超級用戶進程可以提高硬限制值。
資源限制影響到調用進程并由其子進程繼承,這意味著為了影響一個用戶的所有進程,需要將資源限制構造在shell中。

轉載于:https://www.cnblogs.com/mahy/archive/2012/01/04/2310988.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/380003.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/380003.shtml
英文地址,請注明出處:http://en.pswp.cn/news/380003.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JO、JNO、JB、JNB命令詳解(從原理上)

JO 當執行到jo命令時&#xff0c;如果ZF標志位為1&#xff0c;則跳轉&#xff0c;反之不跳轉 add eax,ecx jo 00401000c此時eax7fff ffff &#xff0c;ecx0000 0001&#xff0c;執行完add命令&#xff0c;OF1&#xff0c;原因是eax存儲的最大值是7fffffff&#xff0c;再加1&a…

java 根據類名示例化類_Java類類getProtectionDomain()方法及示例

java 根據類名示例化類類class getProtectionDomain()方法 (Class class getProtectionDomain() method) getProtectionDomain() method is available in java.lang package. getProtectionDomain()方法在java.lang包中可用。 getProtectionDomain() method is used to return …

snagit 9.0注冊碼

8.0的注冊碼 A5CCU-RYNM4-C9ECC-5CWW9-B5R7B 5HCC5-4CCC9-NGXCM-XYDZ5-H6ER6 HLHAD-2CZLC-8XYDC-CC5CB-P289A D5DSC-WZCBM-JRHSC-QVTEV-TR7R8 snagit 9.0: name:Team Z.W.T sn:XMYU5-9CMBC-5SLBZ-DKML2-JE8M5 謝謝 name:Team Z.W.T sn: WDYMP-8ALRM-GVVV2-PH8VK-6MD27 Z…

vue3 配置 @符號

config,ts 配置 有 爆紅 安裝 npm install 一下 然后 配置 路徑提示功能 tsconfig.json 配置 路徑提示功能 一共這兩個路徑配置

android 頁面轉換

通過setContentView來改變布局 很簡單 ViewchangeActivity.java package idrc.change;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class ViewchangeActivity extends Activity {/** Called when the…

mts模式_MTS的完整形式是什么?

mts模式MTS&#xff1a;Microsoft Transaction Server /移動電話服務/多通道電視聲音 (MTS: Microsoft Transaction Server/ Mobile Telephone Service/ Multichannel Television Sound) 1)MTS&#xff1a;Microsoft Transaction Server (1) MTS: Microsoft Transaction Server…

Java——IO流

一&#xff0c;IO流常識 Ⅰ&#xff0c;IO流的概述 1&#xff0c;IO流用來處理設備之間的數據傳輸 2&#xff0c;Java對數據的操作都是通過流的方式 3&#xff0c;Java用于操作流的類都在IO包中 4&#xff0c;流 按流向分為&#xff1a; ①輸入流 ②輸出流 5&#xff0…

JBE、JNBE、JA、JL指令詳解(從原理上)

JBE 當執行到JBE命令時&#xff0c;如果此時的CF標志位或者ZF標志位為1&#xff0c;跳轉&#xff0c;其他不跳轉 相當于小于等于命令 cmp eax&#xff0c;ecx jbe 0040100c執行到cmp命令時&#xff0c;如果此時的eac小于等于ecx&#xff0c;jbe都會跳轉到0040100c 因為小于的…

數組shift方法_數組shift()方法以及JavaScript中的示例

數組shift方法JavaScript shift()方法 (JavaScript shift() method) shift() method is used to remove the first element of an array and returns the deleted element. shift()方法用于刪除數組的第一個元素&#xff0c;并返回刪除的元素。 It changes the array length. …

ArcMap 9使用技巧

ArcMap 9使用技巧技巧1 重疊要素的選擇切換目標&#xff1a;在覆蓋同一區域的多個要素中切換被選擇要素操作步驟&#xff1a;1&#xff0e;在編輯環境中選中覆蓋同一區域的多個要素中的一個要素2&#xff0e;按下N 鍵&#xff0c;被選要素就會自動地切換到另一個圖層的要素3&am…

《軟件》2011年第6期刊登出 《DB 查詢分析器》中斷SQL語句的執行

《軟件》編輯部寄來了2011年第6期樣刊&#xff0c;在2011年第6期&#xff0c;刊登出了本人的論文------“《DB 查詢分析器》中斷SQL語句的執行”。 論文刊登在第42頁&#xff0c;排在第13篇&#xff0c;還比較靠前&#xff0c;呵呵。 在“萬方數據”和“中國期刊全文數據庫”中…

Java——IO流(序列流)

序列化與反序列化 游戲存檔&#xff1a;目的是為了游戲下次上號數據的保存 package com.yy.otherio;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; im…

ret2libc過地址隨機化

程序&#xff1a; #include<stdio.h> char buf2[10] "this is buf2"; void vul() {char buf1[10];gets(buf1); } void main() {write(1,"sinxx",5);vul(); }很明顯&#xff0c;gets函數存在溢出 編譯&#xff1a; gcc -no-pie -fno-stack-protect…

[導入]Lucene并發訪問

作者: yagesi 鏈接&#xff1a;http://yagesi.javaeye.com/blog/165604 發表時間: 2008年02月27日 聲明&#xff1a;本文系JavaEye網站發布的原創博客文章&#xff0c;未經作者書面許可&#xff0c;嚴禁任何網站轉載本文&#xff0c;否則必將追究法律責任&#xff01; 在Luce…

Python程序計算給定文本中單詞的出現

Given a text (paragraph) and a word whose occurrence to be found in the text/paragraph, we have to find the how many times word is repeated in the text. 給定一個文本 (段落)&#xff0c;其出現在文本/段落被找到的單詞 &#xff0c;我們必須找到如何詞多次在文本重…

js私有共有成員

在小項目中對于JavaScript使用&#xff0c;只要寫幾個function就行了。但在大型項目中&#xff0c;尤其是在開發追求 良好的用戶體驗的網站中&#xff0c;如SNS,就會 用到大量的JavaScrpt&#xff0c;有時JavaScript的工作量勝過了C#&#xff0c;這時寫一堆function,就會顯得很…

Java——IO(打印流)

1&#xff0c;打印字節流(PrintStream)的概述&#xff1a; 打印流可以很方便的將對象的toString()結果輸出并且自動加上換行&#xff0c;而且可以使用自動刷出的模式 System.out就是一個PrintStream&#xff0c;其默認向控制臺輸出信息 2&#xff0c;使用方式&#xff1a; …

MATLAB中的正態分布檢驗

要對一組樣本進行正態性檢驗&#xff0c;在MATLAB中&#xff0c;一種方法是用normplot畫出樣本&#xff0c;如果都分布在一條直線上&#xff0c;則表明樣本來自正態分布&#xff0c;否則是非正態分布。 MATLAB中也提供了幾種更正式的檢驗方法&#xff1a;kstest Kolmogorov-Smi…

遠控免殺專題(29)-C#加載shellcode免殺-5種方式(VT免殺率8-70)

0x00 免殺能力一覽表 幾點說明&#xff1a; 1、表中標識 √ 說明相應殺毒軟件未檢測出病毒&#xff0c;也就是代表了Bypass。 2、為了更好的對比效果&#xff0c;大部分測試payload均使用msf的windows/meterperter/reverse_tcp模塊生成。 3、由于本機測試時只是安裝了360全家…

kotlin 或 運算_Kotlin程序對兩個數字執行算術運算

kotlin 或 運算Here, we are implementing a Kotlin program to perform various arithmetic operations on two numbers. 在這里&#xff0c;我們正在實現Kotlin程序&#xff0c;以對兩個數字執行各種算術運算 。 Given two numbers a and b, we have to find addition, sub…