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