歡迎您光臨本站 註冊首頁

進程式控制制 筆記

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

1,關於真實和有效用戶,用戶組的說明:
僅拿用戶來說明,組原理類似.
真實用戶是你登陸的時候所使用的用戶名的數字化表示.它在你的登陸期間不會
被改變,是你最本質的品質.
有效用戶是指在執行一個程序時變成另外的許可權的用戶.舉個例子,古代的一個
刺史,它平時真實身分就是一個刺史,可當他要行使超越自己許可權的法辦時,比如
懲罰一個比他更高的官員,這時,如果他有一個尚方寶劍(具有皇帝的權力),這
時他的 有效身份就是皇帝.但平時,這個有效身份和他的真實身份是一樣的.

真實用戶ID: getuid(void);
有效用戶ID: geteuid(void);
真實用戶組ID: getgid(void);
有效用戶組ID: getegid(void);
2,得到用戶和用戶組的信息
getlogin函數可以返回執行程序的用戶的登陸名.然後這個登陸名可以作為參數
傳遞給getpwname函數,從而返回/etc/passwd文件中與該登錄名相應的一行完整信
息.另種方法是,將進程的UID傳遞給getpwuid函數,同樣返回/etc/passwd文件中
合適的條目.
#include <unistd.h>
char *getlogin(void);

#include <pwd.h>
struct passwd *getpwnam(const char *name);
3,linux 進程的三個獨立的時間值
Wall clock time(牆上時鐘時間)是流逝的時間
User CPU time(用戶CPU時間)是進程花在執行用戶模式(非內核模式)代碼上的
時間總量
System CPU time(系統CPU時間)是花在執行內核代碼上的時間總是.
通過times或getrusage可以獲得這些信息.
#include <sys/times.h>


clock_t times(struct tms *buf);
返回牆上時鐘時間,buf保存了當前進程的時間.
在<sys/times.h>定義的tms結構
struct tms {
clock_t tms_utime; // User CPU time
clock_t tms_stime; //System CPU time
clock_t tms_cutime; //User CPU time of chilren
clock_t tms_cstime; //System CPU time of chilren.
這值值clock_t都是時鐘滴答數,要轉換成秒還要通過sysconf函數轉換.
_SC_CLK_TCK是定義每秒鐘有多少滴答的宏.

4,資源利用信息
利用函數getrusage
#include <sys/times.h>
#include <sys/resource.h>
#include <unistd.h>
int getrusage(int who, struct rusage *usage);
這裡重點在於usage上,而who參數只能取值RUSAGE_SELF或RUSAGE_CHILDREN,表示
是返回調用進程的資源利用信息還是子進程的資源利用信息.這裡對包含
在<sys/resource.h>的rusage結構進行說明:
struct rusage {
struct timeval ru_utime; // user time used
struct timeval ru_sutime; // system time used
long ru_maxrss; // maximum resident set size
long ru_maxixrss; // shared memory size
long ru_maxidrss; // unshared data dize
long ru_maxisrss; // unshared stack size
long ru_minflt; // page reclaims
long ru_majflt; // page faults
long ru_nswap; // swaps
long ru_inblock; // block input operations
long ru_outblock; // block output operations
long ru_msgsnd; // message sent
long ru_msgrcv; //message received
long ru_nsignals; // siganls received
long ru_nvcsw; // voluntary contex switches
long ru_nivcsw; //involuntary contex switches
}

說明
但linux只支持資源:
ru_utime--用戶模式(非內核)代碼時間
ru_stime--內核代碼的時間


ru_minflt--次要失效數(訪問內存而沒有引起磁碟訪問)
ru_majflt--主要失效數(內存訪問引起磁碟訪問)

5,會話和進程的概念
有的情況中進程間不能簡單的用父子來概括,如果對於管道,涉及到幾個進程,
這時,這些相關的進程就成為進程組,可以被統一控制(如殺死).一個進程
組(process group)是相關進程的一個集合,這些相關進程能和是在一個管道的命
令序列.都進程組中的所有的進程都有相同的進程組號,即PGID.使用進程組的目
的是為了方便作業控制.例如,假定你運行了命令行管道 ls -l /usr/include |
sort | wc -l.如果要在其還在運行時殺死它(按Ctrl C),則shell需能終止所有
的進程.它通過殺死進程組而不是每個進程來做到這一點.
會話(session)是由一個或多個進程組構成,會話領導(session leader)進程是創
建會話的進程,每個會話都有惟一標識號,稱為會話ID(session ID),它只是會話
領導的進程PID.會話對進程組起的作用和進程組對單個進程起的作用一樣.方便
控制.

6,fork
#include <unistd.h>
pid_t fork(void);
成功向父進程返回子進程的PID,向子進程返回0.
子進程和父進程有一樣的真實和有效的UID,GID,進程組和會話ID,環境,資源限
制,打開的文件以及共享內存段.但子進程不繼承父進程的超時設置(alarm調
用),父進程創建的文件鎖,未決信號.
7,exec函數族
以前作過筆記,再複習一次.
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const *path, const char *arg,char *cont envp[]);


int execv(const char *path, char *const argv[]);
int execve(const char *path, const argv[], char *const envp[]);
int execvp(const char *file, char *const argv[]);

相關的,操控進程運行的環境的函數:
#include <stdlib.h>
int utenv(const char *string);
char *getenv(const char *name);
說明:getenv查找名為name的環境變數並返回指向其值的指針,如果沒有找到則
返回NULL.putenv添加或改變string中指定的"name = value" 對.如果它執行成
功,則返回0,如果執行失敗,則返回-1.

8,popen函數
它和system函數行為類似,但它是一種無需使用fork和exec就能在執行外部的程
序的簡易方法.但和system不同,popen使用管道來工作.原型
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
說明:popen調用管道,並創建通過標準輸入,或者從command指定的程序或腳本
的標準輸出來的管道,但不是兩者都有.第二個參數type在讀取管道的stdout時為
r,在寫入stdin時為w.它和I/O的用法有點違反直覺.請寫都是相對於command而言
的,所以command的輸出是從stdout讀入的.要向command輸入,則需向它的stdin
寫入.
9,等待進程--wait 函數族
只有兩個函數
#include <sys/wait.h>
#include <sys/types.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
說明,status保存了進程的退出狀態,而waitpid中pid 可能取值:
-1 等待任何PGID==PID絕對值的子進程
1 等待任何子進程
0 等待任何PGID==調用進程的子進程
>0 等待PID==pid的子進程
對於option決定調用的行為,可以是WNOHANG導致在沒有子進程退出時立即返回.


也可以是WUNTRACED,在沒有報告狀態的進程而返回.

10, kill函數殺死進程.
#include <signal.h>
#include <sys/types.h>
int kill(pid, int sig);
11,信號
對於收到一個信號後有三種處理辦法:
》忽略這個信號
》捕獲這個信號,使執行一段稱為信號處理器的特殊代碼.
》允許執行其默認操作
可利用kill函數發送信號.
除了SIGSTOP 和 SIGKILL,其它信號都可以被捕獲或忽略.
pause函數掛起調用它的進程直到有任何信號到達.
#include <unistd.h>
int pause(void);
創建和設置信號集合,然後通過sigprocmask設置或修改當前信號掩碼,設置要捕
獲的信號,再向內核登記一個信號處理器(sigaction函數),第二個捕捉信
號.

創建,設置,查詢一個信號集合
#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);
登記信號處理器
#include <signale.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
說明: how 可取值:
SIG_BLOCK --set包含其它要阻塞的信號
SIG_UNBLOCK -- set 包含要解除阻塞的信號
SIG_SETMASK --set包含新的信號掩碼
如果how為NULL,它被忽略.如果set為NULL,當前掩碼保存在oldset中,如果
oldset為NULL,也被忽略.
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct
sigaction *oldact);
// sigaction為signum所指定的信號設置信號處理器,sigaction結
構(act,oldact描述了信號的部署.在signal.h中有sigaction結構:


struct sigaction{
void (*sa_hundler)(int);
sigset_t sa_mask;
int sa_flag;
void (*sa_restorer)(void);
}
這個結構描述了當signum中的信號產生后要調用的處理器或者函數sa_hundler,
它也可被賦值SIG_DEF,引起signum默認動作發生,賦值SIG_IGN,使忽略這個信
號.
sa_mask定義了在執行處理器期間應該阻塞的其它信號集合的信號掩碼.
sa_flags是修正sa_handler行為的掩碼.可以為如下的值:
SA_NOCLDSTOP-- 進程忽略子進程產生的任何SIGSTOP,SIGSTP,SIGTTIN和SIGTTOU
信號
SA_ONESHOT 或 SA_RESETHAND--登記的自定義信號處理器只執行一次.在執行完
畢后,恢複信號的默認動作.
SA_RESTART--讓可重啟的系統調用起作用
SA_NOMASK或 SA_NODEFER--不避免在信號自己的處理器中接收信號本身.
對於函數中的sa_restorer元素,已經被廢棄.

12,檢測信號
sigpending使進程檢測未決信號(當阻塞時被掛起的信號),然後可決定是忽略
它們還是遞送它們.
#include <signal.h>
int sigpending(sigset_t *set);
未決信號集合在 set中返回,然後可以使用sigismember判斷感興趣的信號是否是
未決信號.

13,進程調度
#include <sched.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
int sched_setscheduler(pid_t pid, int policy ,const struct sched_param
*p);
int sched_getscheduler(pid_t pid);
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
int getpriority(int which, int who);
int setpriority(int which, int who, int prio);
int nice(int inc);

本文出自 「WIK」 博客,請務必保留此出處http://noyear.blog.51cto.com/819034/405844


[火星人 ] 進程式控制制 筆記已經有460次圍觀

http://coctec.com/docs/linux/show-post-49532.html