#include <unistd.h>
#include <sys/types.h>
uid_t getuid(void);
uid_t geteuid(void);
作用:getuid返回當前進程的實際用戶ID;geteuid返回當前用戶的有效用戶ID。這兩個總是成功,不會失敗。
?
#include <unistd.h>
#include <sys/types.h>
gid_t getgid(void);
gid_t getegid(void);
作用:getuid返回當前進程的實際用戶組ID;geteuid返回當前用戶的有效用戶組ID。這兩個總是成功,不會失敗。因此返回值總是大于或等于0,0為超級用戶root。
uid、euid、gid和egid的區別。
linux系統中每個進程都有2個用戶ID,分別為用戶ID(uid)和有效用戶ID(euid),UID一般表示進程的創建者(屬于哪個用戶創建),而EUID表示進程對于文件和資源的訪問權限(具備等同于哪個用戶的權限)。C語言中,可以通過函數getuid( )和geteuid()來獲得進程的兩個ID值。當一個用戶登陸系統時,系統會將UID和EUID都賦值為/etc/passwd文件中的UID,一般情況下2個ID是相同的,但是某些情況下會出現2個ID不同的情況。
gid和egid同理。
首先,修改一下文件屬性,setuid或setgid:chmod u+s printid 這樣一來,文件在執行階段具有文件所有者的權限,此時進程的euid為文件所有者的ID;如在使用sudo命令時,euid為root用戶,以root用戶的身份訪問操作文件或執行命令; chmod g+s printid? 這樣一來,文件在執行階段具有文件所屬組的權限,此時進程的egid為文件所屬組的ID。
?
區分一個函數是“系統函數”還是“庫函數”依據:1.是否訪問內核數據結構;2.是否訪問外部硬件資源。二者有任一個,則為系統函數;二者均無,則為庫函數。比如,fork、getpid、getuid和getgid等函數就是系統函數,因為它們需要訪問內核的數據結構PCB。