APUE學習筆記——第七章 進程環境

1、main函數

原型:int main(int argc, char *argv[])  其中argc是命令行參數的數目,argv是指向參數的各個指針構成的數組。

main函數的命令行參數代碼如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[]){
    int i;
    for(i = 0 ; i < argc ; i ++)
        printf("argv[%d]: %s\n",i,argv[i]);
    return 0;
}
執行樣例:

./7_1_main main test
argv[0]: ./7_1_main
argv[1]: main
argv[2]: test

2、進程終止

正常終止包括:(1)從main返回,(2)調用exit;(3)調用_exit或者_Exit;(4)最後啓動一個線程從其啓動例程返回;(5)最後一個線程調用pthread_exit。

異常終止包括:(1)調用abort();(2)接收到一個信號並終止;(3)最後一個線程對取消請求做出響應。
a、exit函數系列:_exit和_Exit函數立即進入內核,而exit函數則執行清理處理(如關閉標準I/O流,執行各終止處理程序)。在main函數執行return (0)與exit(0)是等價的。

#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);

個人認爲使用exit和return比較好。

b、atexit函數

用來登記終止處理程序,一個進程可以登記多達32個函數,這些函數將有exit自動調用,調用順序與登記順序相反,同一個函數可以登記多次,則也會被調用多次。

調用和登記是用棧來存儲的,先進後出原則。

#include <stdlib.h>

int atexit(void (*func) (void))


3、環境表

想得到UNIX環境表的方式如下:

extern char **environ;

while(*environ != NULL)
         puts(*environ++);

這樣和在Linux環境下執行env命令得到的結果是一樣的,這裏沒啥好說的。

4、環境變量

由上述的環境表如果想得到某個參數的具體值可以使用如下函數:

#include <stdlib.h>
char *getenv(const char *name); //指向與name關聯的value的指針,若未找到返回NULL
int putenv(char *string);  //取形式爲name=value的字符串,將其放到環境表中
int setenv(const char *name, const char *value, int rewrite); //將name設置爲value,若rewrite爲0則不刪除現有的定義,rewrite非0則刪除其現有的定義
int unsetenv(const char *name);  //刪除name的定義
int clearenv(void); //刪除環境表中所有項

5、存儲器分配

即動態內存分配,有三個函數:

a、malloc,分配指定字節的空間(常用)

b、calloc,爲指定數量具有指定長度的對象分配存儲空間,該空間中每一位初始化爲0

c、realloc更改以前分配區的長度

#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);//釋放內存空間

6、setjmp和longjmp函數

在C語言中goto語句只能在函數內部跳轉,而setjmp和longjmp可以跨越函數。

#include <setjmp.h>
int setjmp(jmp_buf env);//返回值爲0爲直接調用,從longjmp調用返回爲非0值
int longjmp(sigjmp_buf env, int val);

這裏的例子建議去看教材。

本章最後還有個資源限制,不知爲何物,不說了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章