Linux進程學習筆記一

1. 進程函數

}進程id:pid_t  非負整型
延遲重用原則:賦予新進程的id不同於最近終止進程id
id=0,調度進程,交換進程(swapper),屬於內核
id=1,init進程,系統BIOS時由內核調用
id=2,頁守護進程,負責虛擬存儲系統的分頁操作
pid_t getpid( void ): 得到進程的進程id
pid_t getppid( void ): 得到進程的父進程id

}int main( ing argc, char *argv[] )
}C程序總是從main函數開始執行。
}當內核執行C程序時,在調用main函數前首先調用一個特殊的啓動例程。啓動例程從內核取得命令行參數和環境變量值
}
}啓動例程從main返回後立即調用exit函數
}exit( main( argc, argv[] ))
}
}內核是程序執行的唯一方法是調用一個exec函數,進程自願終止的唯一方法是顯示或隱式地調用exit函數

1.1 Exit函數

}有三個函數用於正常終止一個程序:
void _exit (int  status)
void _Exit (int status)
void exit (int status)

_exit和_Exit立即進入內核。

exit則先執行一些清理處理(包括關閉標準I/O流等),然後進入內核。Exit函數總是會爲I/O做清理關閉工作:爲所有打開流調用fclose函數。

Main函數中,exit(0) 與 return(0) 是等價的。

2. 進程存儲空間

 

}Data數據段分爲初始化的數據和非初始化的數據
}Exec從程序文件中讀入代碼段和初始化的數據段,非初始化的數據由exec初始化爲0
}存放於磁盤上的程序文件中的段爲代碼段和初始化數據段
}未初始化數據段不存放於磁盤上,由內核在程序開始運行前被設置成0

2.1 存儲分配例程

}Void* malloc( size_t size)  :分配size個字節的空間
}Void* calloc( size_t n, size_t size) :分配n個size字節的空間
}Void* realloc( void* ptr, size_t newsize)  :重新分配空間
}Void free( void* ptr) :釋放空間

Malloc分配的存儲區中初始值不確定,calloc分配的空間中每一位都初始化爲0

存儲分配例程通常使用sbrk系統調用實現,該系統調用擴充或縮小進程的堆。


3. 環境表

}每個程序都有一個環境表。
}環境表是一個字符指針數組,其中每個指針包含一個以null結束的C字符串的地址。
}全局變量environ包含了該指針數組的地址
}extern  char ** environ
}char * getenv( const char *name) :獲取環境變量值
}int putenv( char* str ): 將name=value字符串放入環境表
}int setenv( char* name, char* value, int rewrite): 將環境表中name值設置爲value。若環境表中name已存在,則a)若rewrite非0,則先刪除現有定義; b)若rewrite爲0,則不設置
}int unsetenv( char* name) : 刪除環境表中name的定義


4. 父子進程

}pid_t  fork ( void ) : 創建子進程
}Fork函數被調用一次,但返回兩次。兩次返回的唯一區別是子進程的返回值是0,父進程的返回值是新子進程的進程id
}
}子進程獲得父進程數據空間、堆和棧的副本。父子進程並不共享這些存儲部分,他們共享代碼段。
}由於在fork之後經常跟隨者exec,所以現在的很多實現並不執行一個父進程數據段、棧、堆的完全複製,而是寫時複製( copy onwrite),內核爲修改區域的那段內存製作一個副本。
}Fork之後是父進程還是子進程先執行是不確定的
}父進程的所有打開文件描述符都被複制到子進程裏,共享一個文件表項
























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