轉自:http://net.pku.edu.cn/~yhf/linux_c/function/07.html
|
endgrent(關閉組文件) |
相關函數
|
getgrent,setgrent |
表頭文件
|
#include<grp.h> #include<sys/types.h> |
定義函數
|
void endgrent(void); |
函數說明
|
endgrent()用來關閉由getgrent()所打開的密碼文件。 |
返回值
|
|
附加說明
|
|
范例
|
請參考getgrent()與setgrent()。 |
|
endpwent(關閉密碼文件) |
相關函數
|
getpwent,setpwent |
表頭文件
|
#include<pwd.h> #include<sys/types.h> |
定義函數
|
void endpwent(void); |
函數說明
|
endpwent()用來關閉由getpwent()所打開的密碼文件。 |
返回值
|
|
附加說明
|
|
范例
|
請參考getpwent()與setpwent()。 |
|
endutent(關閉utmp 文件) |
相關函數
|
getutent,setutent |
表頭文件
|
#include<utmp.h> |
定義函數
|
void endutent(void); |
函數說明
|
endutent()用來關閉由getutent所打開的utmp文件。 |
返回值
|
|
附加說明
|
|
范例
|
請參考getutent()。 |
|
fgetgrent(從指定的文件來讀取組格式) |
相關函數
|
fgetpwent |
表頭文件
|
#include<grp.h> #include<stdio.h> #include<sys/types.h> |
定義函數
|
struct group * getgrent(FILE * stream); |
函數說明
|
fgetgrent()會從參數stream指定的文件讀取一行數據,然后以group結構將該數據返回。參數stream所指定的文件必須和、etc/group相同的格式。group結構定義請參考getgrent()。 |
返回值
|
返回group結構數據,如果返回NULL則表示已無數據,或有錯誤發生。 |
范例
|
#include <grp.h> #include<sys/types.h> #include<stdio.h> main() { struct group *data; FILE *stream; int i; stream = fopen("/etc/group", "r"); while((data = fgetgrent(stream))!=0){ i=0; printf("%s :%s:%d :", data->gr_name,data->gr_passwd,data->gr_gid); while (data->gr_mem[i])printf("%s,",data->gr_mem[i++]); printf("\n"); } fclose(stream); } |
執行
|
root:x:0:root, bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin,adm adm:x:4:root,adm,daemon tty:x:5 disk:x:6:root lp:x:7:daemon,lp mem:x:8 kmem:x:9 wheel:x:10:root mail:x:12:mail news:x:13:news uucp:x:14:uucp man:x:15 games:x:20 gopher:x:30 dip:x:40: ftp:x:50 nobody:x:99: |
|
fgetpwent(從指定的文件來讀取密碼格式) |
相關函數
|
fgetgrent |
表頭文件
|
#include<pwd.h> #include<stdio.h> #include<sys/types.h> |
定義函數
|
struct passwd * fgetpwent(FILE *stream); |
函數說明
|
fgetpwent()會從參數stream指定的文件讀取一行數據,然后以passwd結構將該數據返回。參數stream所指定的文件必須和/etc/passwd相同的格式。passwd結構定義請參考getpwent()。 |
返回值
|
返回passwd結構數據,如果返回NULL則表示已無數據,或有錯誤發生。 |
范例
|
#include<pwd.h> #include<sys/types.h> main() { struct passwd *user; FILE *stream; stream = fopen("/etc/passwd", "r"); while((user = fgetpwent(stream))!=0){ printf("%s:%d:%d:%s:%s:%s\n",user->pw_name,user->pw_uid,user->pw_gid,user->pw_gecos,user->pw_dir,user->pw_shell); } } |
執行
|
root:0:0:root:/root:/bin/bash bin:1:1:bin:/bin: daemon:2:2:daemon:/sbin: adm:3:4:adm:/var/adm: lp:4:7:lp:/var/spool/lpd: sync:5:0:sync:/sbin:/bin/sync shutdown:6:0:shutdown:/sbin:/sbin/shutdown halt:7:0:halt:/sbin:/sbin/halt mail:8:12:mail:/var/spool/mail: news:9:13:news:var/spool/news uucp:10:14:uucp:/var/spool/uucp: operator:11:0:operator :/root: games:12:100:games:/usr/games: gopher:13:30:gopher:/usr/lib/gopher-data: ftp:14:50:FTP User:/home/ftp: nobody:99:99:Nobody:/: xfs:100:101:X Font Server: /etc/Xll/fs:/bin/false gdm:42:42:/home/gdm:/bin/bash kids:500:500: : /home/kids:/bin/bash |
|
getegid(取得有效的組識別碼) |
相關函數
|
getgid,setgid,setregid |
表頭文件
|
#include<unistd.h> #include<sys/types.h> |
定義函數
|
gid_t getegid(void); |
函數說明
|
getegid()用來取得執行目前進程有效組識別碼。有效的組識別碼用來決定進程執行時組的權限。返回值返回有效的組識別碼。 |
范例
|
main() { printf("egid is %d\n",getegid()); } |
執行
|
egid is 0 /*當使用root身份執行范例程序時*/ |
|
geteuid(取得有效的用戶識別碼) |
相關函數
|
getuid,setreuid,setuid |
表頭文件
|
#include<unistd.h> #include<sys/types.h> |
定義函數
|
uid_t geteuid(void) |
函數說明
|
geteuid()用來取得執行目前進程有效的用戶識別碼。有效的用戶識別碼用來決定進程執行的權限,借由此改變此值,進程可以獲得額外的權限。倘若執行文件的setID位已被設置,該文件執行時,其進程的euid值便會設成該文件所有者的uid。例如,執行文件/usr/bin/passwd的權限為-r-s--x--x,其s 位即為setID(SUID)位,而當任何用戶在執行passwd 時其有效的用戶識別碼會被設成passwd 所有者的uid 值,即root的uid 值(0)。 |
返回值
|
返回有效的用戶識別碼。 |
范例
|
main() { printf ("euid is %d \n",geteuid()); } |
執行
|
euid is 0 /*當使用root身份執行范例程序時*/ |
|
getgid(取得真實的組識別碼) |
相關函數
|
getegid,setregid,setgid |
表頭文件
|
#include<unistd.h> #include<sys/types.h> |
定義函數
|
gid_t getgid(void); |
函數說明
|
getgid()用來取得執行目前進程的組識別碼。 |
返回值
|
返回組識別碼 |
范例
|
main() { printf(“gid is %d\n”,getgid()); } |
執行
|
gid is 0 /*當使用root身份執行范例程序時*/ |
|
getgrent(從組文件中取得賬號的數據) |
相關函數
|
setgrent,endgrent |
表頭文件
|
#include<grp.h> #include <sys/types.h> |
定義函數
|
struct group *getgrent(void); |
函數說明
|
getgrent()用來從組文件(/etc/group)中讀取一項組數據,該數據以group 結構返回。第一次調用時會取得第一項組數據,之后每調用一次就會返回下一項數據,直到已無任何數據時返回NULL。 struct group{ char *gr_name; /*組名稱*/ char *gr_passwd; /* 組密碼*/ gid_t gr_gid; /*組識別碼*/ char **gr_mem; /*組成員賬號*/ } |
返回值
|
返回group結構數據,如果返回NULL則表示已無數據,或有錯誤發生。 |
附加說明
|
getgrent()在第一次調用時會打開組文件,讀取數據完畢后可使用endgrent()來關閉該組文件。 |
錯誤代碼
|
ENOMEM 內存不足,無法配置group結構。 |
范例
|
#include<grp.h> #include<sys/types.h> main() { struct group *data; int i; while((data= getgrent())!=0){ i=0; printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data->gr_gid); while(data->gr_mem[i])printf(“%s,”,data->gr_mem[i++]); printf(“\n”); } endgrent(); } |
執行
|
root:x:0:root, bin:x:1:root,bin,daemon, daemon:x:2:root,bin,daemon, sys:x:3:root,bin,adm, adm:x:4:root,adm,daemon tty:x:5 disk:x:6:root lp:x:7:daemon,lp mem:x:8 kmem:x:9: wheel:x:10:root mail:x:12:mail news:x:13:news uucp:x:14:uucp man:x:15: games:x:20 gopher:x:30 dip:x:40 ftp:x:50 nobody:x:99 |
|
getgrgid(從組文件中取得指定gid 的數據) |
相關函數
|
fgetgrent,getgrent,getgrnam |
表頭文件
|
#include<grp.h> #include<sys/types.h> |
定義函數
|
strcut group * getgrgid(gid_t gid); |
函數說明
|
getgrgid()用來依參數gid指定的組識別碼逐一搜索組文件,找到時便將該組的數據以group結構返回。group結構請參考getgrent()。 |
返回值
|
返回group結構數據,如果返回NULL則表示已無數據,或有錯誤發生。 |
范例
|
/* 取得gid=3的組數據*/ #include<grp.h> #include<sys/types.h> main() { strcut group *data; int i=0; data = getgrgid(3); printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data->gr_gid); while(data->gr_mem[i])printf(“%s ,”,data->mem[i++]); printf(“\n”); } |
執行
|
sys:x:3:root,bin,adm |
|
getgrnam(從組文件中取得指定組的數據) |
相關函數
|
fgetgrent,getrent,getgruid |
表頭文件
|
#include<grp.h> #include<sys/types.h> |
定義函數
|
strcut group * getgrnam(const char * name); |
函數說明
|
getgrnam()用來逐一搜索參數那么指定的組名稱,找到時便將該組的數據以group結構返回。group 結構請參考getgrent()。 |
返回值
|
返回group結構數據,如果返回NULL則表示已無數據,或有錯誤發生。 |
范例
|
/* 取得adm的組數據*/ #include<grp.h> #include<sys/types.h> main() { strcut group * data; int i=0; data = getgrnam(“adm”); printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data->gr_gid); while(data->gr_mem[i])printf(“%s,”,data->gr_mem[i++]); printf(“\n”); } |
執行
|
adm:x:4:root,adm,daemon |
|
getgroups(取得組代碼) |
相關函數
|
initgroups,setgroup,getgid,setgid |
表頭文件
|
#include<unistd.h> #include<sys/types.h> |
定義函數
|
int getgroups(int size,gid_t list[]); |
函數說明
|
getgroup()用來取得目前用戶所屬的組代碼。參數size為list〔〕所能容納的gid_t 數目。如果參數size 值為零,此函數僅會返回用戶所屬的組數。 |
返回值
|
返回組識別碼,如有錯誤則返回-1。 |
錯誤代碼
|
EFAULT 參數list數組地址不合法。EINVAL 參數size值不足以容納所有的組。 |
范例
|
#include<unistd.h> #include<sys/types.h> main() { gid_t list[500]; int x,i; x = getgroups(0.list); getgroups(x,list); for(i=0;i<x;i++) printf(“%d:%d\n”,i,list[i]); } |
執行
|
0:00 1:01 2:02 3:03 4:04 5:06 6:10 |
|
getpw(取得指定用戶的密碼文件數據) |
相關函數
|
getpwent |
表頭文件
|
#include<pwd.h> #include<sys/types.h> |
定義函數
|
int getpw(uid_t uid,char *buf); |
函數說明
|
getpw()會從/etc/passwd中查找符合參數uid所指定的用戶賬號數據,找不到相關數據就返回-1。所返回的buf字符串格式如下:賬號:密碼:用戶識別碼(uid):組識別碼(gid):全名:根目錄:shell |
返回值
|
返回0表示成功,有錯誤發生時返回-1。 |
附加說明
|
1. getpw()會有潛在的安全性問題,請盡量使用別的函數取代。 2. 使用shadow的系統已把用戶密碼抽出/etc/passwd,因此使用getpw()取得的密碼將為“x”。 |
范例
|
#include<pwd.h> #include<sys/types.h> main() { char buffer[80]; getpw(0,buffer); printf(“%s\n”,buffer); } |
執行
|
root:x:0:0:root:/root:/bin/bash |
|
getpwent(從密碼文件中取得賬號的數據) |
相關函數
|
getpw,fgetpwent,getpwnam,getpwuid,setpwent,endpwent |
表頭文件
|
#include<pwd.h> #include<sys/types.h> |
定義函數
|
strcut passwd * getpwent(void); |
函數說明
|
getpwent()用來從密碼文件(/etc/passwd)中讀取一項用戶數據,該用戶的數據以passwd 結構返回。第一次調用時會取得第一位用戶數據,之后每調用一次就會返回下一項數據,直到已無任何數據時返回NULL。 passwd 結構定義如下 struct passwd{ char * pw_name; /*用戶賬號*/ char * pw_passwd; /*用戶密碼*/ uid_t pw_uid; /*用戶識別碼*/ gid_t pw_gid; /*組識別碼*/ char * pw_gecos; /*用戶全名*/ char * pw_dir; /*家目錄*/ char * pw_shell; /* 所使用的shell路徑*/ }; |
返回值
|
返回passwd 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。 |
附加說明
|
getpwent()在第一次調用時會打開密碼文件,讀取數據完畢后可使用endpwent()來關閉該密碼文件。錯誤代碼ENOMEM 內存不足,無法配置passwd結構。 |
范例
|
#include<pwd.h> #include<sys/types.h> main() { struct passwd *user; while((user = getpwent())!=0){ printf(“%s:%d:%d:%s:%s:%s\n”,user->pw_name,user->pw_uid,user->pw_gid, user->pw_gecos,user->pw_dir,user->pw_shell); } endpwent(); } |
執行
|
root:0:0:root:/root:/bin/bash bin:1:1:bin:/bin: daemon:2:2:daemon:/sbin: adm:3:4:adm:/var/adm: lp:4:7:lp:/var/spool/lpd: sync:5:0:sync:/sbin:/bin/sync shutdown:6:0:shutdown:/sbin:/sbin/shutdown halt:7:0:halt:/sbin:/sbin/halt mail:8:12:mail:/var/spool/mail: news:9:13:news:var/spool/news uucp:10:14:uucp:/var/spool/uucp: operator:11:0:operator :/root: games:12:100:games:/usr/games: gopher:13:30:gopher:/usr/lib/gopher-data: ftp:14:50:FTP User:/home/ftp: nobody:99:99:Nobody:/: xfs:100:101:X Font Server: /etc/Xll/fs:/bin/false gdm:42:42:/home/gdm:/bin/bash kids:500:500: : /home/kids:/bin/bash |
|
getpwnam(從密碼文件中取得指定賬號的數據) |
相關函數
|
getpw,fgetpwent,getpwent,getpwuid |
表頭文件
|
#include<pwd.h> #include<sys/types.h> |
定義函數
|
struct passwd * getpwnam(const char * name); |
函數說明
|
getpwnam()用來逐一搜索參數name 指定的賬號名稱,找到時便將該用戶的數據以passwd結構返回。passwd結構請參考getpwent()。 |
返回值
|
返回passwd 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。 |
范例
|
/*取得root賬號的識別碼和根目錄*/ #include<pwd.h> #include<sys/types.h> main() { struct passwd *user; user = getpwnam(“root”); printf(“name:%s\n”,user->pw_name); printf(“uid:%d\n”,user->pw_uid); printf(“home:%s\n”,user->pw_dir); } |
執行
|
name:root uid:0 home:/root |
|
getpwuid(從密碼文件中取得指定uid 的數據) |
相關函數
|
getpw,fgetpwent,getpwent,getpwnam |
表頭文件
|
#include<pwd.h> #include<sys/types.h> |
定義函數
|
struct passwd * getpwuid(uid_t uid); |
函數說明
|
getpwuid()用來逐一搜索參數uid 指定的用戶識別碼,找到時便將該用戶的數據以結構返回結構請參考將該用戶的數據以passwd 結構返回。passwd 結構請參考getpwent()。 |
返回值
|
返回passwd 結構數據,如果返回NULL 則表示已無數據,或者有錯誤發生。 |
范例
|
#include<pwd.h> #include<sys/types.h> main() { struct passwd *user; user= getpwuid(6); printf(“name:%s\n”,user->pw_name); printf(“uid:%d\n”,user->pw_uid); printf(“home:%s\n”,user->pw_dir); } |
執行
|
name:shutdown uid:6 home:/sbin |
|
getuid(取得真實的用戶識別碼) |
相關函數
|
geteuid,setreuid,setuid |
表頭文件
|
#include<unistd.h> #include<sys/types.h> |
定義函數
|
uid_t getuid(void); |
函數說明
|
getuid()用來取得執行目前進程的用戶識別碼。 |
返回值
|
用戶識別碼 |
范例
|
main() { printf(“uid is %d\n”,getuid()); } |
執行
|
uid is 0 /*當使用root身份執行范例程序時*/ |
|
getutent(從utmp 文件中取得賬號登錄數據) |
相關函數
|
getutent,getutid,getutline,setutent,endutent,pututline,utmpname |
表頭文件
|
#include<utmp.h> |
定義函數
|
struct utmp *getutent(void); |
函數說明
|
getutent()用來從utmp 文件(/var/run/utmp)中讀取一項登錄數據,該數據以utmp 結構返回。第一次調用時會取得第一位用戶數據,之后每調用一次就會返回下一項數據,直到已無任何數據時返回NULL。 utmp結構定義如下 struct utmp { short int ut_type; /*登錄類型*/ pid_t ut_pid; /*login進程的pid*/ char ut_line[UT_LINESIZE];/*登錄裝置名,省略了“/dev/”*/ char ut_id[4]; /* Inittab ID*/ char ut_user[UT_NAMESIZE];/*登錄賬號*/ char ut_host[UT_HOSTSIZE];/*登錄賬號的遠程主機名稱*/ struxt exit_status ut_exit;/* 當類型為DEAD_PROCESS時進程的結 束狀態*/ long int ut_session; /*Sessioc ID*/ struct timeval ut_tv; /*時間記錄*/ int32_t ut_addr_v6[4]; /*遠程主機的網絡地址*/ char __unused[20]; /* 保留未使用*/ }; ut_type有以下幾種類型: EMPTY 此為空的記錄。 RUN_LVL 記錄系統run-level的改變 BOOT_TIME 記錄系統開機時間 NEW_TIME 記錄系統時間改變后的時間 OLD_TINE 記錄當改變系統時間時的時間。 INIT_PROCESS 記錄一個由init衍生出來的進程。 LOGIN_PROCESS 記錄login進程。 USER_PROCESS 記錄一般進程。 DEAD_PROCESS 記錄一結束的進程。 ACCOUNTING 目前尚未使用。 exit_status結構定義 struct exit_status { short int e_termination; /*進程結束狀態*/ short int e_exit; /*進程退出狀態*/ }; timeval的結構定義請參考gettimeofday()。 相關常數定義如下: UT_LINESIZE 32 UT_NAMESIZE 32 UT_HOSTSIZE 256 |
返回值
|
返回utmp 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。 |
附加說明
|
getutent()在第一次調用時會打開utmp 文件,讀取數據完畢后可使用endutent()來關閉該utmp文件。 |
范例
|
#include<utmp.h> main() { struct utmp *u; while((u=getutent())){ if(u->ut_type = = USER_PROCESS) printf(“%d %s %s %s \n”,u->ut_type,u->ut_user,u->ut_line,u->ut_host); } endutent(); } |
執行
|
/* 表示有三個root賬號分別登錄/dev/pts/0,/dev/pts/1,/dev/pts/2 */ 7 root pts/0 7 root pts/1 7 root pts/2 |
|
getutid(從utmp 文件中查找特定的記錄) |
相關函數
|
getutent,getutline |
表頭文件
|
#include<utmp.h> |
定義函數
|
strcut utmp *getutid(strcut utmp *ut); |
函數說明
|
getutid()用來從目前utmp 文件的讀寫位置逐一往后搜索參數ut指定的記錄,如果ut->ut_type 為RUN_LVL,BOOT_TIME,NEW_TIME,OLD_TIME 其中之一則查找與ut->ut_type 相符的記錄;若ut->ut_type 為INIT_PROCESS,LOGIN_PROCESS,USER_PROCESS或DEAD_PROCESS其中之一,則查找與ut->ut_id相符的記錄。找到相符的記錄便將該數據以utmp 結構返回。utmp結構請參考getutent()。 |
返回值
|
返回utmp 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。 |
范例
|
#include<utmp.h> main() { struct utmp ut,*u; ut.ut_type=RUN_LVL; while((u= getutid(&ut))){ printf(“%d %s %s %s\n”,u->ut_type,u->ut_user,u->ut_line,u->ut_host); } } |
執行
|
1 runlevel - |
|
getutline(從utmp 文件中查找特定的記錄) |
相關函數
|
getutent,getutid,pututline |
表頭文件
|
#include<utmp.h> |
定義函數
|
struct utmp * getutline (struct utmp *ut); |
函數說明
|
getutline()用來從目前utmp文件的讀寫位置逐一往后搜索ut_type為USER_PROCESS 或LOGIN_PROCESS 的記錄,而且ut_line 和ut->ut_line 相符。找到相符的記錄便將該數據以utmp 結構返回,utmp結構請參考getutent()。 |
返回值
|
返回utmp 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。 |
范例
|
#include<utmp.h> main() { struct utmp ut,*u; strcpy (ut.ut_line,”pts/1”); while ((u=getutline(&ut))){ printf(“%d %s %s %s \n”,u->ut_type,u->ut_user,u->ut_line,u->ut_host); } } |
執行
|
7 root pts/1 |
|
initgroups(初始化組清單) |
相關函數
|
setgrent,endgrent |
表頭文件
|
#include<grp.h> #include<sys/types.h> |
定義函數
|
int initgroups(const char *user,gid_t group); |
函數說明
|
initgroups()用來從組文件(/etc/group)中讀取一項組數據,若該組數據的成員中有參數user時,便將參數group組識別碼加入到此數據中。 |
返回值
|
執行成功則返回0,失敗則返回-1,錯誤碼存於errno。 |
|
pututline(將utmp 記錄寫入文件) |
相關函數
|
getutent,getutid,getutline |
表頭文件
|
#include<utmp.h> |
定義函數
|
void pututline(struct utmp *ut); |
函數說明
|
pututline()用來將參數ut的utmp結構記錄到utmp文件中。此函數會先用getutid()來取得正確的寫入位置,如果沒有找到相符的記錄則會加入到utmp文件尾,utmp結構請參考getutent()。 |
返回值
|
|
附加說明
|
需要有寫入/var/run/utmp 的權限 |
范例
|
#include<utmp.h> main() { struct utmp ut; ut.ut_type =USER_PROCESS; ut.ut_pid=getpid(); strcpy(ut.ut_user,”kids”); strcpy(ut.ut_line,”pts/1”); strcpy(ut.ut_host,”www.gnu.org”); pututline(&ut); } |
執行
|
/*執行范例后用指令who -l 觀察*/ root pts/0 dec9 19:20 kids pts/1 dec12 10:31(www.gnu.org) root pts/2 dec12 13:33 |
|
seteuid(設置有效的用戶識別碼) |
相關函數
|
setuid,setreuid,setfsuid |
表頭文件
|
#include<unistd.h> |
定義函數
|
int seteuid(uid_t euid); |
函數說明
|
seteuid()用來重新設置執行目前進程的有效用戶識別碼。在Linux下,seteuid(euid)相當於setreuid(-1,euid)。 |
返回值
|
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno |
附加說明
|
請參考setuid |
|
setfsgid(設置文件系統的組識別碼) |
相關函數
|
setuid,setreuid,seteuid,setfsuid |
表頭文件
|
#include<unistd.h> |
定義函數
|
int setfsgid(uid_t fsgid); |
函數說明
|
setfsgid()用來重新設置目前進程的文件系統的組識別碼。一般情況下,文件系統的組識別碼(fsgid)與有效的組識別碼(egid)是相同的。如果是超級用戶調用此函數,參數fsgid 可以為任何值,否則參數fsgid必須為real/effective/saved的組識別碼之一。 |
返回值
|
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno。 |
附加說明
|
此函數為Linux特有。 |
錯誤代碼
|
EPERM 權限不夠,無法完成設置。 |
|
setfsuid(設置文件系統的用戶識別碼) |
相關函數
|
setuid,setreuid,seteuid,setfsgid |
表頭文件
|
#include<unistd.h> |
定義函數
|
int setfsuid(uid_t fsuid); |
函數說明
|
setfsuid()用來重新設置目前進程的文件系統的用戶識別碼。一般情況下,文件系統的用戶識別碼(fsuid)與有效的用戶識別碼(euid)是相同的。如果是超級用戶調用此函數,參數fsuid可以為任何值,否則參數fsuid必須為real/effective/saved的用戶識別碼之一。 |
返回值
|
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno |
附加說明
|
此函數為Linux特有 |
錯誤代碼
|
EPERM 權限不夠,無法完成設置。 |
|
setgid(設置真實的組識別碼) |
相關函數
|
getgid,setregid,getegid,setegid |
表頭文件
|
#include<unistd.h> |
定義函數
|
int setgid(gid_t gid); |
函數說明
|
setgid()用來將目前進程的真實組識別碼(real gid)設成參數gid值。如果是以超級用戶身份執行此調用,則real、effective與savedgid都會設成參數gid。 |
返回值
|
設置成功則返回0,失敗則返回-1,錯誤代碼存於errno中。 |
錯誤代碼
|
EPERM 並非以超級用戶身份調用,而且參數gid 並非進程的effective gid或saved gid值之一。 |
|
setgrent(從頭讀取組文件中的組數據) |
相關函數
|
getgrent,endgrent |
表頭文件
|
#include<grp.h> #include<sys/types.h> |
定義函數
|
void setgrent(void); |
函數說明
|
setgrent()用來將getgrent()的讀寫地址指回組文件開頭。 |
返回值
|
|
附加說明
|
請參考setpwent()。 |
|
setgroups(設置組代碼) |
相關函數
|
initgroups,getgroup,getgid,setgid |
表頭文件
|
#include<grp.h> |
定義函數
|
int setgroups(size_t size,const gid_t * list); |
函數說明
|
setgroups()用來將list 數組中所標明的組加入到目前進程的組設置中。參數size為list()的gid_t數目,最大值為NGROUP(32)。 |
返回值
|
設置成功則返回0,如有錯誤則返回-1。 |
錯誤代碼
|
EFAULT 參數list數組地址不合法。 EPERM 權限不足,必須是root權限 EINVAL 參數size值大於NGROUP(32)。 |
|
setpwent(從頭讀取密碼文件中的賬號數據) |
相關函數
|
getpwent,endpwent |
表頭文件
|
#include<pwd.h> #include<sys/types.h> |
定義函數
|
void setpwent(void); |
函數說明
|
setpwent()用來將getpwent()的讀寫地址指回密碼文件開頭。 |
返回值
|
|
范例
|
#include<pwd.h> #include<sys/types.h> main() { struct passwd *user; int i; for(i=0;i<4;i++){ user=getpwent(); printf(“%s :%d :%d :%s:%s:%s\n”,user->pw_name,user->pw_uid,user->pw_gid, user->pw_gecos,user->pw_dir,user->pw_shell); } setpwent(); user=getpwent(); printf(“%s :%d :%d :%s:%s:%s\n”,user->pw_name,user->pw_uid,user->pw_gid, user->pw_gecos,user->pw_dir,user->pw_shell); endpwent(); } |
執行
|
root:0:0:root:/root:/bin/bash bin:1:1:bin:/bin daemon:2:2:daemon:/sbin adm:3:4:adm:/var/adm root:0:0:root:/root:/bin/bash |
|
setregid(設置真實及有效的組識別碼) |
相關函數
|
setgid,setegid,setfsgid |
表頭文件
|
#include<unistd.h> |
定義函數
|
int setregid(gid_t rgid,gid_t egid); |
函數說明
|
setregid()用來將參數rgid設為目前進程的真實組識別碼,將參數egid設置為目前進程的有效組識別碼。如果參數rgid或egid值為-1,則對應的識別碼不會改變。 |
返回值
|
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno。 |
|
setreuid(設置真實及有效的用戶識別碼) |
相關函數
|
setuid,seteuid,setfsuid |
表頭文件
|
#include<unistd.h> |
定義函數
|
int setreuid(uid_t ruid,uid_t euid); |
函數說明
|
setreuid()用來將參數ruid 設為目前進程的真實用戶識別碼,將參數euid 設置為目前進程的有效用戶識別碼。如果參數ruid 或euid值為-1,則對應的識別碼不會改變。 |
返回值
|
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno。 |
附加說明
|
請參考setuid()。 |
|
setuid(設置真實的用戶識別碼) |
相關函數
|
getuid,setreuid,seteuid,setfsuid |
表頭文件
|
#include<unistd.h> |
定義函數
|
int setuid(uid_t uid) |
函數說明
|
setuid()用來重新設置執行目前進程的用戶識別碼。不過,要讓此函數有作用,其有效的用戶識別碼必須為0(root)。在Linux下,當root使用setuid()來變換成其他用戶識別碼時,root權限會被拋棄,完全轉換成該用戶身份,也就是說,該進程往后將不再具有可setuid()的權利,如果只是向暫時拋棄root 權限,稍后想重新取回權限,則必須使用seteuid()。 |
返回值
|
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno。 |
附加說明
|
一般在編寫具setuid root的程序時,為減少此類程序帶來的系統安全風險,在使用完root權限后建議馬上執行setuid(getuid());來拋棄root權限。此外,進程uid和euid不一致時Linux系統將不會產生core dump。 |
|
setutent(從頭讀取utmp 文件中的登錄數據) |
相關函數
|
getutent,endutent |
表頭文件
|
#include<utmp.h> |
定義函數
|
void setutent(void); |
函數說明
|
setutent()用來將getutent()的讀寫地址指回utmp文件開頭。 |
附加說明
|
請參考setpwent()或setgrent()。 |
|
utmpname(設置utmp 文件路徑) |
相關函數
|
getutent,getutid,getutline,setutent,endutent,pututline |
表頭文件
|
#include<utmp.h> |
定義函數
|
void utmpname(const char * file); |
函數說明
|
utmpname()用來設置utmp文件的路徑,以提供utmp相關函數的存取路徑。如果沒有使用utmpname()則默認utmp文件路徑為/var/run/utmp。 |
返回值
|
|