2 進程通常由程序、數據和進程控制塊3個部分組成。程序部分描述了進程所要完成的功能;數據部分為進程提供了搜需的堆棧和私有數據;進程控制塊含有進程的描述和控制信息。 2 進程和線程:一個進程可以擁有多個線程。線程沒有獨立的資源,它共享進程的ID,共享進程的資源。線程是UNIX中最小的調度單位。 2 前臺進程和后臺進程:用戶在Shell提示符下鍵入命令,創建進程,此后該進程接管終端,Shell中不能再輸入其他的命令,知道進程執行完畢,才將終端控制權返回Shell并顯示用戶提示符。這樣的進程就是前臺進程。‚如果用戶再輸入Shell命令時,在命令串后加上“&”,shell將不等待進程執行完畢就直接返回,于是就可以同事運行進程和執行shell操作,這樣的進程就是后臺進程,后臺進程并不接管終端,所以必須是非交互式的。 2 守護進程:與終端無關,常駐后臺執行的特殊進程。UNIX中最著名的兩個守護進程:sysproc進程,它是UNIX的第一個進程,標識號為0,能合理地調度系統中運行的進程,負責將進程從硬盤交換區調入內如或者講進程從內存調到硬盤交換區‚init進程,系統初始化進程,標識號1,是除sysproc外所有進程的祖先。 2 進程狀態:運行態:進程已經分配到CPU,正在處理機上執行時的狀態。同意時刻處于運行態的進程數不能大于CPU的數目。運行態可分為用戶態和核心態。如果進程正在運行用戶代碼,進程處于用戶態。如果進程出現系統調用或者系統中斷,運行操作系統內部代碼,進程處于核心態。‚就緒態:進程已具備運行條件,但其他進程正在用CPU,所以暫時不能運行而等待分配CPU的狀態。處于就緒態的進程一旦獲得了CPU就能立刻運行。ƒ睡眠態:進程正在等待某種事件的發生而暫時不能運行的狀態。處于睡眠態的進程尚不具備運行條件,即使CPU空閑,它也無法使用。 2 進程標識號:UNIX中每個進程具有唯一的標識號,操作系統采用一個非負整數標識每一個進程。 UNIX中讀取進程ID號的函數如下: #include <sys/types.h> #include<unistd.h> pid_t getpid(); //返回當前進程ID pid_t getpgrp(); //返回當前進程組ID pid_t getppid(); //返回父進程ID 類型pid_t是進程標識類型,可以用long或者int代替 2 進程的用戶標識號:當進程由用戶啟動時,該用戶的標識號就是進程的實際用戶標識,該用戶的組標識號就是進程實際組標識號。進程的實際用戶標識號和實際組標識號僅用于系統記賬,參與權限檢查的是進程的有效用戶標識號和有效組標識號。一般情況下,實際標識號和有效標識號相一致。 UNIX中讀取用戶ID號函數如下: #include<unistd.h> uid_t getuid(); //返回進程實際用戶ID uid_t geteuid(); //返回進程有效用戶ID gid_t getgid(); //返回進程實際組ID gid_t getegid(); //返回進程有效組ID 實例: #include <sys/types.h> #include <unistd.h> void main() { printf("pid=%d,gid=%d,ppid=%d\n",getpid(),getpgrp(),getppid()); printf("uid=%d,euid=%d,gid=%d,egid=%d\n",getuid(),geteuid(),getgid(),getegid()); } 2 進程命令行 實例: #include <stdio.h> void main(int argc,char * argv[]) { int i; fprintf(stderr,"argc=%d\n",argc); for(i=0;i<argc;i++) fprintf(stderr,"argv[%d]=%s\n",i,argv); } 2 環境變量 UNIX中,存儲了一系列的變量,在shell下執行"env"命令查看。 環境變量分為系統環境變量和用戶環境變量。系統環境變量在注冊師自動設置。用戶環境變量在shell中使用賦值命令和export命令設置。如下例設置了變量ZYX,再將其轉化為用戶環境變量: #ZYX=/u/zyx //賦值語句 #export ZYX //export語句 #env |grep zyx //驗證變量 ZYX=/u/zyx 2 獲取環境變量的方法: 全局變量法。 UNIX用一個指針數組來存儲全部環境值: extern char **environ; 實例: #include <stdio.h> extern char **environ; int main() { char **p=environ; while(*p) { fprintf(stderr,"%s\n",*p); p++; } } ‚函數調用法。 UNIX中操作環境變量的函數如下: #include <stdlib.h> char *getenv(char *name); int putenv(const char *string); 函數getenv以字符串形式返回環境變量name的取值,如果參數name為NULL或者環境變量列表無name變量,返回NULL。 函數putenv增加、修改或刪除環境變量。參數string指向一個字符串,格式為“name=value”。如果環境列表中沒有name變量,則增加變量并設置值為"value";如果變量已經存在,則更改其值為"value";如果value為空,在刪除環境變量name的值。函數成功時返回非0值,否則返回0。 實例: #include <stdlib.h> #include <stdio.h> int main(int argc,char **argv) { int i; for(i=1;i<argc;i++) fprintf(stderr,"%s=%s\n",argv,getenv(argv));
}
|