程式:存放在磁碟檔案中的可執行檔案
程序:程式執行的例項(process)
cmd: ps ,top
程序id:每個程序都有乙個非負整數標識的唯一程序id
0是排程程序,1是init程序,(大多數unix系統)2是頁守護程序page daemon
/*除了程序id,程序還可以用下面的函式返回其他的標誌符*/
#include pid_t getpid(void); 返回:呼叫程序的程序id
pid_t getppid(void); 返回:呼叫程序的父程序id
uid_t getuid(void); 返回:呼叫程序的實際使用者id
uid_t geteuid(void); 返回:呼叫程序的有效使用者id
gid_t getgid(void); 返回:呼叫程序的實際組id
gid_t getegid(void); 返回:呼叫程序的有效組id
在linux中,建立新程序的唯一方法是某個已經存在的程序呼叫fork()函式,新建立的程序是子程序,已存在的稱為父程序。
#include pid_t fork(void);
fork()函式是乙個系統呼叫,當父程序呼叫fork()時,fork()返回兩個值:父程序會返回子程序的pid,這是個大於0的整數,而子程序會返回0。父程序和子程序會繼續執行fork()之後的語句,子程序會繼承父程序的資料空間、堆和棧的副本,但是不共享儲存空間。寫時複製(copy-on-write)技術:核心將(資料段、棧和堆)的許可權改為唯讀,父程序和子程序中的任乙個想要修改副本,則核心只為修改區域的那塊記憶體製作乙個副本,通常是虛擬記憶體中的一頁page。
fork()的兩種用法:
1.乙個父程序複製自己,使父程序和子程序同時執行不同的**段
2.乙個父程序複製自己,要執行不同的程式
#include pid_t vfork();
vfork()和fork()的區別:
1.vfork子程序和父程序共享資料段,fork則不共享
2.vfork的子程序比父程序先執行,在它呼叫exec或者exit之後,父程序才會開始執行
程序有5種正常終止程序和3種異常終止程序的方法
1.在main函式中使用return
2.呼叫eixt函式
3.呼叫_exit或者_exit函式
4.程序的最後乙個執行緒在其啟動例程中執行return語句
5.程序的最後乙個執行緒呼叫pthread_exit
1.呼叫abort()
2.當程序接收到某些訊號時
3.最後乙個執行緒對「取消」請求做出響應
不管程序如何終止,最後都會執行核心裝的同一段**。這段**會關閉程序所有的描述符,釋放它的儲存器
若父程序在子程序結束前終止,則子程序會成」孤兒」程序,init會成為這個程序的」養父」
乙個已經終止,但是父程序並未進行善後處理的程序成為僵死程序(zombie),ps狀態z
#include int atexit(void (*func)(void));
atexit是乙個退出程序註冊函式。exit執行時會先執行atexit註冊的函式,且多次註冊多次執行,先執行後註冊的函式。
區別在於exit會先執行一些清理處理(例如沖洗i/o),然後返回核心,而_exit和_exit會直接返回核心
#include pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
wait和waitpid都是阻塞的函式,但是waitpid可以設定為非阻塞,option設定為wnohang
#include extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp);
int execv(const char *path, char *const ar**);
int execvp(const char *file, char *const ar**);
int execvpe(const char *file, char *const ar**,
char *const envp);
如:execlp("/bin/echo", "echo", "hello", (char *)0)
#include int system(const char *cmdsting);
system可以在程式中執行乙個命令
程序建立和終止時會建立程序會計以及寫入資料,因此一直執行的程序是沒有程序會計檔案的,如init程序
程序可以通過改變nice值來修改優先順序,nice值越大,優先順序越低
#include #include int nice(int nice);
int getpriority(int which, id_t who);
int setpriority(int which, id_t who, int value);
nice值基於0~2*nzero-1,
nzero可以通過sysconf(_sc_nzero)獲取
nice()可以返回-1,因此,返回-1不能判定失敗,需要同時檢視errno是否為不為0
#include #include struct rusage ;
clock_t times(struct tms *buf);
int getrusage(int who, strcut rusage*rusage);
AutoMapper用法一瞥
首先 如下 var startuptasktypes typefinder.findclassesoftype var startuptasks new list foreach var startuptasktype in startuptasktypes startuptasks.add ist...
javascript ruby和C效能一瞥 2
好吧,最後讓我們用c來實現,看看再能榨取多少效能。注意我沒有改變演算法,c的演算法和之前的3種都是基本相同的 include include include include include include include typedef unsigned long long ull if faile...
瞞天過海html檔案技術一瞥
很多的站點的字尾都是html檔案,甚至有的站點竟然有這樣的檔案字尾html?url asp888.net,有的 朋友可能就會非常的迷惑,難道html 檔案也可以向 asp 檔案一樣程式設計嗎?其實 大家都被欺騙了 我在這裡給大家講一下這個 瞞天過海的 技術是怎麼實現的?首先我們需要做一些準備工作 建...