在unix系統中,每個程序都有乙個非負整型表示的唯一程序id。當乙個程序終止時,程序id可以重新被其他程序使用,為了防止誤判,unix系統實現延遲重用演算法,即新建的程序id不同於最近終止程序所使用的id。
程序id為0的是排程程序,也稱為交換程序,是核心的一部分,不執行磁碟上的程式,因此也稱為系統程序。程序id為1的是init程序,負責在自舉核心後啟動乙個unix系統,init通常讀與系統有關的初始檔案,並將系統引導到乙個狀態,該程序不是終止,它是乙個普通的使用者程序。下面函式是對程序id的操作。
[cpp]view plain
copy
/* 程序id */
/** 函式功能:獲取程序id;
* 返回值:所呼叫程序的id;
* 函式原型:
*/#include
pid_t getpid(void
);
/** 函式功能:獲取父程序id;
* 返回值:所呼叫程序的父程序id;
* 函式原型:
*/pid_t getppid(void
);
/** 函式功能:程序實際使用者id;
* 返回值:所呼叫程序的實際使用者id;
* 函式原型:
*/uid_t getuid(void
);
/** 函式功能:程序有效使用者id;
* 返回值:所呼叫程序的有效使用者id;
* 函式原型:
*/uid_t geteuid(void
);
/** 函式功能:程序實際組id;
* 返回值:所呼叫程序的實際組id;
* 函式原型:
*/gid_t getgid(void
);
/** 函式功能:程序有效組id;
* 返回值:所呼叫程序的有效組id;
* 函式原型:
*/gid_t getegid(void
);
測試程式:
[cpp]view plain
copy
#include
#include "apue.h"
intmain(
void
)
輸出結果:
[cpp]view plain
copy
pid: 9136.
ppid: 3765.
uid: 1000.
euid: 1000.
gid: 1000.
egid: 1000.
為了能夠滿足一些程序的訪問許可權,我們會對程序id進行更改,主要是更改程序的使用者id和組id。更改id的規則如下:實際使用者id是指程序執行者;有效使用者id是指程序執行時對檔案的訪問許可權;儲存的設定使用者id是有效使用者id的副本,在執行exec呼叫時後能重新恢復原來的有效使用者id。注:以下的規則也適用於組id。
若程序具有超級使用者特權,則setuid函式將實際使用者id、有效使用者id,以及儲存的設定使用者id設定為uid。
若程序沒有超級使用者許可權,但是uid等於實際使用者id或儲存的設定使用者id,則setuid函式將有效使用者id設定為uid。不改變實際使用者和儲存的設定使用者id。
若以上都不滿足,則將errno設定為eperm,並返回-1。
關於核心維護的三個使用者id,應注意以下幾點:
只有超級使用者才可以修改實際使用者id。
僅當對程式檔案設定了設定使用者id位時,exec函式才會設定有效使用者id。
儲存的設定使用者id是由exec函式複製有效使用者id而得來的。
改變三個使用者id的不同方法如下圖所示:
以下是更改程序id的函式
[cpp]view plain
copy
/* 更改程序id */
/** 函式功能:設定使用者或組id(包括有效、實際和儲存的設定使用者的id);
* 返回值:若成功則返回0,若出錯則返回-1;
* 函式原型:
*/#include
intsetuid(uid_t uid);
intsetgid(gid_t gid);
/** 函式功能:交換實際使用者(組)id和有效使用者(組)id;
* 返回值:若成功則返回0,若出錯則返回-1;
*/#include
intsetreuid(uid_t ruid, uid_t euid);
intsetregid(gid_t rgid, gid_t egid);
/* 說明:
* 若其中任一引數值為-1,則表示id不變;
*//*
* 函式功能:更改有效使用者或有效組id;
* 返回值:若成功則返回0,若出錯則返回-1;
* 函式原型:
*/#include
intseteuid(uid_t uid);
intsetegid(gid_t gid);
unix環境高階程式設計 程序環境與程序控制
a 終止 i.程序終止 1.正常終止 return exit exit 系a exit與 exit 的區別 exit退出時按 atexit 註冊的相反順序呼叫註冊過的函式,對開啟的流呼叫 fclose 將緩衝區的資料寫到檔案上 重新整理緩衝區 exit 沒有 b exit與自然返回 return 的...
《unix高階環境程式設計》程序控制 程序時間
程序時間有牆上時鐘時間 使用者cpu時間和系統cpu時間。任一程序都可以呼叫 times 函式以獲得它自己以及終止子程序的上述值。cpp view plain copy 程序時間 返回值 若成功則返回流逝的牆上時鐘時間 單位 時鐘滴答數 若出錯則返回 1 函式原型 include clock t t...
Unix環境高階程式設計 程序控制 二
一 函式wait 和waitpid 今天我們繼續通過昨天那個死爹死兒子的故事來講 便於記憶 現在看看 wait 和waitpid 函式。include pid t wait int statloc pid t waitpid pid t pid int statloc int options 若成功...