1. 程式人生 > >Linux系統編程_6_進程環境(C程序典型的存儲空間)

Linux系統編程_6_進程環境(C程序典型的存儲空間)

har vdh == tro 一個 sts 函數返回 首地址 shell

1.八種結束Linux進程的方法:

五種正常終止方式:

main函數返回;

調用exit;

調用_exit或_Exit

最後一個線程從其啟動例程返回

最後一個線程調用pthread_exit

三種異常終止方式:

調用abort。

接收到一個信號終止;

最後一個線程對取消請求做出響應。


exit函數與_exit _Exit函數的差別是exit函數在結束進程之前會調用各種終止處理程序,關閉全部IO流,這會造成全部緩沖中的數據被沖洗(寫到磁盤文件);

atexit(void (*fun)void)函數,用來給進程註冊函數。退出時會運行註冊過的函數。註冊幾次會調用幾次。


2.命令行參數與環境表:

extern char **environ; //每一個程序都會有一張環境表,與參數表一樣,環境表也是一個字符指針數組,當中每一個指針以NULL(\0)結束;

全局變量environ指向了該環境表的首地址;

#include <stdio.h>

int main(int argc, char **argv, char **env)
{
    int i;

    printf("================Argv Pram===================\n");
    for(i=0; i<argc; i++)
    {
        printf("argc[%d]= %s\n", i, argv[i]);
    }

    printf("\n=============Environment Pram==============\n");
    for(; *env != NULL; env++)
    {
        printf("%s\n", *env);
    }

    return 0;
}

運行結果:

================Argv Pram===================
argc[0]= ./main


=============Environment Pram==============
HOSTNAME=150
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.0.88 12069 22

(......)

3. C程序典型的存儲空間

C程序典型的存儲空間例如以下:

技術分享

對於X86處理器的Linux上,正文段從0x08048000單元開始,棧底則在0xc0000000之下開始。堆頂和棧底之間未使用的空間非常大。

註意:未初始化的bss段並不存放在磁盤上的程序文件裏,原因是內核在程序開始執行前都將它們設置為0,須要存放在程序文件裏的段僅僅有正文段和初始化數據段。



Linux系統編程_6_進程環境(C程序典型的存儲空間)