《unix高階環境程式設計》程序控制 程序ID

2021-06-27 06:04:56 字數 2562 閱讀 4773

在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 若成功...