| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > Linux开发区 > 软件开发

Linux常用C函数-用户组篇

时间:2006-11-01 10:14:20  来源:Linux联盟收集  作者:
用户组篇g6zLinux联盟
endgrent,g6zLinux联盟
endpwent,g6zLinux联盟
endutent,g6zLinux联盟
fgetgrent,g6zLinux联盟
fgetpwent,g6zLinux联盟
getegid,g6zLinux联盟
geteuid,g6zLinux联盟
getgid,g6zLinux联盟
getgrent,g6zLinux联盟
getgrgid,g6zLinux联盟
getgrnam,g6zLinux联盟
getgroups,g6zLinux联盟
getpw,g6zLinux联盟
getpwent,g6zLinux联盟
getpwnam,g6zLinux联盟
getpwuid,g6zLinux联盟
getuid,g6zLinux联盟
getutent,g6zLinux联盟
getutid,g6zLinux联盟
getutline,g6zLinux联盟
initgroups,g6zLinux联盟
pututline,g6zLinux联盟
seteuid,g6zLinux联盟
setfsgid,g6zLinux联盟
setfsuid,g6zLinux联盟
setgid,g6zLinux联盟
setgrent,g6zLinux联盟
setgroups,g6zLinux联盟
setpwent,g6zLinux联盟
setregid,g6zLinux联盟
setreuid,g6zLinux联盟
setuid,g6zLinux联盟
setutent,g6zLinux联盟
utmpname,g6zLinux联盟
endgrent(关闭组文件)
相关函数
getgrent,setgrentg6zLinux联盟
表头文件
#include<grp.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
void endgrent(void);g6zLinux联盟
函数说明
endgrent()用来关闭由getgrent()所打开的密码文件。g6zLinux联盟
返回值
g6zLinux联盟
附加说明
g6zLinux联盟
范例
请参考getgrent()与setgrent()。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
endpwent(关闭密码文件)
相关函数
getpwent,setpwentg6zLinux联盟
表头文件
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
void endpwent(void);g6zLinux联盟
函数说明
endpwent()用来关闭由getpwent()所打开的密码文件。g6zLinux联盟
返回值
g6zLinux联盟
附加说明
g6zLinux联盟
范例
请参考getpwent()与setpwent()。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
endutent(关闭utmp 文件)
相关函数
getutent,setutentg6zLinux联盟
表头文件
#include<utmp.h>g6zLinux联盟
定义函数
void endutent(void);g6zLinux联盟
函数说明
endutent()用来关闭由getutent所打开的utmp文件。g6zLinux联盟
返回值
g6zLinux联盟
附加说明
g6zLinux联盟
范例
请参考getutent()。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
fgetgrent(从指定的文件来读取组格式)
相关函数
fgetpwentg6zLinux联盟
表头文件
#include<grp.h>g6zLinux联盟
#include<stdio.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
struct group * getgrent(FILE * stream);g6zLinux联盟
函数说明
fgetgrent()会从参数stream指定的文件读取一行数据,然后以group结构将该数据返回。参数stream所指定的文件必须和、etc/group相同的格式。group结构定义请参考getgrent()。g6zLinux联盟
返回值
返回group结构数据,如果返回NULL则表示已无数据,或有错误发生。g6zLinux联盟
范例
#include <grp.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
#include<stdio.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct group *data;g6zLinux联盟
FILE *stream;g6zLinux联盟
int i;g6zLinux联盟
stream = fopen("/etc/group", "r");g6zLinux联盟
while((data = fgetgrent(stream))!=0){g6zLinux联盟
i=0;g6zLinux联盟
printf("%s :%s:%d :", data->gr_name,data->gr_passwd,data->gr_gid);g6zLinux联盟
while (data->gr_mem[i])printf("%s,",data->gr_mem[i++]);g6zLinux联盟
printf("\n");g6zLinux联盟
}g6zLinux联盟
fclose(stream);g6zLinux联盟
}g6zLinux联盟
执行
root:x:0:root,g6zLinux联盟
bin:x:1:root,bin,daemong6zLinux联盟
daemon:x:2:root,bin,daemong6zLinux联盟
sys:x:3:root,bin,admg6zLinux联盟
adm:x:4:root,adm,daemong6zLinux联盟
tty:x:5g6zLinux联盟
disk:x:6:rootg6zLinux联盟
lp:x:7:daemon,lpg6zLinux联盟
mem:x:8g6zLinux联盟
kmem:x:9g6zLinux联盟
wheel:x:10:rootg6zLinux联盟
mail:x:12:mailg6zLinux联盟
news:x:13:newsg6zLinux联盟
uucp:x:14:uucpg6zLinux联盟
man:x:15g6zLinux联盟
games:x:20g6zLinux联盟
gopher:x:30g6zLinux联盟
dip:x:40:g6zLinux联盟
ftp:x:50g6zLinux联盟
nobody:x:99:g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
fgetpwent(从指定的文件来读取密码格式)
相关函数
fgetgrentg6zLinux联盟
表头文件
#include<pwd.h>g6zLinux联盟
#include<stdio.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
struct passwd * fgetpwent(FILE *stream);g6zLinux联盟
函数说明
fgetpwent()会从参数stream指定的文件读取一行数据,然后以passwd结构将该数据返回。参数stream所指定的文件必须和/etc/passwd相同的格式。passwd结构定义请参考getpwent()。g6zLinux联盟
返回值
返回passwd结构数据,如果返回NULL则表示已无数据,或有错误发生。g6zLinux联盟
范例
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct passwd *user;g6zLinux联盟
FILE *stream;g6zLinux联盟
stream = fopen("/etc/passwd", "r");g6zLinux联盟
while((user = fgetpwent(stream))!=0){g6zLinux联盟
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);g6zLinux联盟
}g6zLinux联盟
}g6zLinux联盟
执行
root:0:0:root:/root:/bin/bashg6zLinux联盟
bin:1:1:bin:/bin:g6zLinux联盟
daemon:2:2:daemon:/sbin:g6zLinux联盟
adm:3:4:adm:/var/adm:g6zLinux联盟
lp:4:7:lp:/var/spool/lpd:g6zLinux联盟
sync:5:0:sync:/sbin:/bin/syncg6zLinux联盟
shutdown:6:0:shutdown:/sbin:/sbin/shutdowng6zLinux联盟
halt:7:0:halt:/sbin:/sbin/haltg6zLinux联盟
mail:8:12:mail:/var/spool/mail:g6zLinux联盟
news:9:13:news:var/spool/newsg6zLinux联盟
uucp:10:14:uucp:/var/spool/uucp:g6zLinux联盟
operator:11:0:operator :/root:g6zLinux联盟
games:12:100:games:/usr/games:g6zLinux联盟
gopher:13:30:gopher:/usr/lib/gopher-data:g6zLinux联盟
ftp:14:50:FTP User:/home/ftp:g6zLinux联盟
nobody:99:99:Nobody:/:g6zLinux联盟
xfs:100:101:X Font Server: /etc/Xll/fs:/bin/falseg6zLinux联盟
gdm:42:42:/home/gdm:/bin/bashg6zLinux联盟
kids:500:500: : /home/kids:/bin/bashg6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getegid(取得有效的组识别码)
相关函数
getgid,setgid,setregidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
gid_t getegid(void);g6zLinux联盟
函数说明
getegid()用来取得执行目前进程有效组识别码。有效的组识别码用来决定进程执行时组的权限。返回值返回有效的组识别码。g6zLinux联盟
范例
main()g6zLinux联盟
{ g6zLinux联盟
printf("egid is %d\n",getegid());g6zLinux联盟
}g6zLinux联盟
执行
egid is 0 /*当使用root身份执行范例程序时*/g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
geteuid(取得有效的用户识别码)
相关函数
getuid,setreuid,setuidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
uid_t geteuid(void)g6zLinux联盟
函数说明
geteuid()用来取得执行目前进程有效的用户识别码。有效的用户识别码用来决定进程执行的权限,借由此改变此值,进程可以获得额外的权限。倘若执行文件的setID位已被设置,该文件执行时,其进程的euid值便会设成该文件所有者的uid。例如,执行文件/usr/bin/passwd的权限为-r-s--x--x,其s 位即为setID(SUID)位,而当任何用户在执行passwd 时其有效的用户识别码会被设成passwd 所有者的uid 值,即root的uid 值(0)。g6zLinux联盟
返回值
返回有效的用户识别码。g6zLinux联盟
范例
main()g6zLinux联盟
{ g6zLinux联盟
printf ("euid is %d \n",geteuid());g6zLinux联盟
}g6zLinux联盟
执行
euid is 0 /*当使用root身份执行范例程序时*/g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getgid(取得真实的组识别码)
相关函数
getegid,setregid,setgidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
gid_t getgid(void);g6zLinux联盟
函数说明
getgid()用来取得执行目前进程的组识别码。g6zLinux联盟
返回值
返回组识别码g6zLinux联盟
范例
main()g6zLinux联盟
{g6zLinux联盟
printf(“gid is %d\n”,getgid());g6zLinux联盟
}g6zLinux联盟
执行
gid is 0 /*当使用root身份执行范例程序时*/g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getgrent(从组文件中取得账号的数据)
相关函数
setgrent,endgrentg6zLinux联盟
表头文件
#include<grp.h>g6zLinux联盟
#include <sys/types.h>g6zLinux联盟
定义函数
struct group *getgrent(void);g6zLinux联盟
函数说明
getgrent()用来从组文件(/etc/group)中读取一项组数据,该数据以group 结构返回。第一次调用时会取得第一项组数据,之后每调用一次就会返回下一项数据,直到已无任何数据时返回NULL。g6zLinux联盟
struct group{g6zLinux联盟
char *gr_name; /*组名称*/g6zLinux联盟
char *gr_passwd; /* 组密码*/g6zLinux联盟
gid_t gr_gid; /*组识别码*/g6zLinux联盟
char **gr_mem; /*组成员账号*/g6zLinux联盟
}g6zLinux联盟
返回值
返回group结构数据,如果返回NULL则表示已无数据,或有错误发生。g6zLinux联盟
附加说明
getgrent()在第一次调用时会打开组文件,读取数据完毕后可使用endgrent()来关闭该组文件。g6zLinux联盟
错误代码
ENOMEM 内存不足,无法配置group结构。g6zLinux联盟
范例
#include<grp.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct group *data;g6zLinux联盟
int i;g6zLinux联盟
while((data= getgrent())!=0){g6zLinux联盟
i=0;g6zLinux联盟
printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data->gr_gid);g6zLinux联盟
while(data->gr_mem[i])printf(“%s,”,data->gr_mem[i++]);g6zLinux联盟
printf(“\n”);g6zLinux联盟
}g6zLinux联盟
endgrent();g6zLinux联盟
}g6zLinux联盟
执行
root:x:0:root,g6zLinux联盟
bin:x:1:root,bin,daemon,g6zLinux联盟
daemon:x:2:root,bin,daemon,g6zLinux联盟
sys:x:3:root,bin,adm,g6zLinux联盟
adm:x:4:root,adm,daemong6zLinux联盟
tty:x:5g6zLinux联盟
disk:x:6:rootg6zLinux联盟
lp:x:7:daemon,lpg6zLinux联盟
mem:x:8g6zLinux联盟
kmem:x:9:g6zLinux联盟
wheel:x:10:rootg6zLinux联盟
mail:x:12:mailg6zLinux联盟
news:x:13:newsg6zLinux联盟
uucp:x:14:uucpg6zLinux联盟
man:x:15:g6zLinux联盟
games:x:20g6zLinux联盟
gopher:x:30g6zLinux联盟
dip:x:40g6zLinux联盟
ftp:x:50g6zLinux联盟
nobody:x:99g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getgrgid(从组文件中取得指定gid 的数据)
相关函数
fgetgrent,getgrent,getgrnamg6zLinux联盟
表头文件
#include<grp.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
strcut group * getgrgid(gid_t gid);g6zLinux联盟
函数说明
getgrgid()用来依参数gid指定的组识别码逐一搜索组文件,找到时便将该组的数据以group结构返回。group结构请参考getgrent()。g6zLinux联盟
返回值
返回group结构数据,如果返回NULL则表示已无数据,或有错误发生。g6zLinux联盟
范例
/* 取得gid=3的组数据*/g6zLinux联盟
#include<grp.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
strcut group *data;g6zLinux联盟
int i=0;g6zLinux联盟
data = getgrgid(3);g6zLinux联盟
printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data->gr_gid);g6zLinux联盟
while(data->gr_mem[i])printf(“%s ,”,data->mem[i++]);g6zLinux联盟
printf(“\n”);g6zLinux联盟
}g6zLinux联盟
执行
sys:x:3:root,bin,admg6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getgrnam(从组文件中取得指定组的数据)
相关函数
fgetgrent,getrent,getgruidg6zLinux联盟
表头文件
#include<grp.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
strcut group * getgrnam(const char * name);g6zLinux联盟
函数说明
getgrnam()用来逐一搜索参数那么指定的组名称,找到时便将该组的数据以group结构返回。group 结构请参考getgrent()。g6zLinux联盟
返回值
返回group结构数据,如果返回NULL则表示已无数据,或有错误发生。g6zLinux联盟
范例
/* 取得adm的组数据*/g6zLinux联盟
#include<grp.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
strcut group * data;g6zLinux联盟
int i=0;g6zLinux联盟
data = getgrnam(“adm”);g6zLinux联盟
printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data->gr_gid);g6zLinux联盟
while(data->gr_mem[i])printf(“%s,”,data->gr_mem[i++]);g6zLinux联盟
printf(“\n”);g6zLinux联盟
}g6zLinux联盟
执行
adm:x:4:root,adm,daemong6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getgroups(取得组代码)
相关函数
initgroups,setgroup,getgid,setgidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
int getgroups(int size,gid_t list[]);g6zLinux联盟
函数说明
getgroup()用来取得目前用户所属的组代码。参数size为list〔〕所能容纳的gid_t 数目。如果参数size 值为零,此函数仅会返回用户所属的组数。g6zLinux联盟
返回值
返回组识别码,如有错误则返回-1。g6zLinux联盟
错误代码
EFAULT 参数list数组地址不合法。EINVAL 参数size值不足以容纳所有的组。g6zLinux联盟
范例
#include<unistd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
gid_t list[500];g6zLinux联盟
int x,i;g6zLinux联盟
x = getgroups(0.list);g6zLinux联盟
getgroups(x,list);g6zLinux联盟
for(i=0;i<x;i++)g6zLinux联盟
printf(“%d:%d\n”,i,list[i]);g6zLinux联盟
}g6zLinux联盟
执行
0:00g6zLinux联盟
1:01g6zLinux联盟
2:02g6zLinux联盟
3:03g6zLinux联盟
4:04g6zLinux联盟
5:06g6zLinux联盟
6:10g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getpw(取得指定用户的密码文件数据)
相关函数
getpwentg6zLinux联盟
表头文件
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
int getpw(uid_t uid,char *buf);g6zLinux联盟
函数说明
getpw()会从/etc/passwd中查找符合参数uid所指定的用户账号数据,找不到相关数据就返回-1。所返回的buf字符串格式如下:账号:密码:用户识别码(uid):组识别码(gid):全名:根目录:shellg6zLinux联盟
返回值
返回0表示成功,有错误发生时返回-1。g6zLinux联盟
附加说明
1. getpw()会有潜在的安全性问题,请尽量使用别的函数取代。g6zLinux联盟
2. 使用shadow的系统已把用户密码抽出/etc/passwd,因此使用getpw()取得的密码将为“x”。g6zLinux联盟
范例
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
char buffer[80];g6zLinux联盟
getpw(0,buffer);g6zLinux联盟
printf(“%s\n”,buffer);g6zLinux联盟
}g6zLinux联盟
执行
root:x:0:0:root:/root:/bin/bashg6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getpwent(从密码文件中取得账号的数据)
相关函数
getpw,fgetpwent,getpwnam,getpwuid,setpwent,endpwentg6zLinux联盟
表头文件
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
strcut passwd * getpwent(void);g6zLinux联盟
函数说明
getpwent()用来从密码文件(/etc/passwd)中读取一项用户数据,该用户的数据以passwd 结构返回。第一次调用时会取得第一位用户数据,之后每调用一次就会返回下一项数据,直到已无任何数据时返回NULL。g6zLinux联盟
passwd 结构定义如下g6zLinux联盟
struct passwd{g6zLinux联盟
char * pw_name; /*用户账号*/g6zLinux联盟
char * pw_passwd; /*用户密码*/g6zLinux联盟
uid_t pw_uid; /*用户识别码*/g6zLinux联盟
gid_t pw_gid; /*组识别码*/g6zLinux联盟
char * pw_gecos; /*用户全名*/g6zLinux联盟
char * pw_dir; /*家目录*/g6zLinux联盟
char * pw_shell; /* 所使用的shell路径*/g6zLinux联盟
};g6zLinux联盟
返回值
返回passwd 结构数据,如果返回NULL 则表示已无数据,或有错误发生。g6zLinux联盟
附加说明
getpwent()在第一次调用时会打开密码文件,读取数据完毕后可使用endpwent()来关闭该密码文件。错误代码ENOMEM 内存不足,无法配置passwd结构。g6zLinux联盟
范例
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct passwd *user;g6zLinux联盟
while((user = getpwent())!=0){g6zLinux联盟
printf(“%s:%d:%d:%s:%s:%s\n”,user->pw_name,user->pw_uid,user->pw_gid,g6zLinux联盟
user->pw_gecos,user->pw_dir,user->pw_shell);g6zLinux联盟
}g6zLinux联盟
endpwent();g6zLinux联盟
}g6zLinux联盟
执行
root:0:0:root:/root:/bin/bashg6zLinux联盟
bin:1:1:bin:/bin:g6zLinux联盟
daemon:2:2:daemon:/sbin:g6zLinux联盟
adm:3:4:adm:/var/adm:g6zLinux联盟
lp:4:7:lp:/var/spool/lpd:g6zLinux联盟
sync:5:0:sync:/sbin:/bin/syncg6zLinux联盟
shutdown:6:0:shutdown:/sbin:/sbin/shutdowng6zLinux联盟
halt:7:0:halt:/sbin:/sbin/haltg6zLinux联盟
mail:8:12:mail:/var/spool/mail:g6zLinux联盟
news:9:13:news:var/spool/newsg6zLinux联盟
uucp:10:14:uucp:/var/spool/uucp:g6zLinux联盟
operator:11:0:operator :/root:g6zLinux联盟
games:12:100:games:/usr/games:g6zLinux联盟
gopher:13:30:gopher:/usr/lib/gopher-data:g6zLinux联盟
ftp:14:50:FTP User:/home/ftp:g6zLinux联盟
nobody:99:99:Nobody:/:g6zLinux联盟
xfs:100:101:X Font Server: /etc/Xll/fs:/bin/falseg6zLinux联盟
gdm:42:42:/home/gdm:/bin/bashg6zLinux联盟
kids:500:500: : /home/kids:/bin/bashg6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getpwnam(从密码文件中取得指定账号的数据)
相关函数
getpw,fgetpwent,getpwent,getpwuidg6zLinux联盟
表头文件
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
struct passwd * getpwnam(const char * name);g6zLinux联盟
函数说明
getpwnam()用来逐一搜索参数name 指定的账号名称,找到时便将该用户的数据以passwd结构返回。passwd结构请参考getpwent()。g6zLinux联盟
返回值
返回passwd 结构数据,如果返回NULL 则表示已无数据,或有错误发生。g6zLinux联盟
范例
/*取得root账号的识别码和根目录*/g6zLinux联盟
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct passwd *user;g6zLinux联盟
user = getpwnam(“root”);g6zLinux联盟
printf(“name:%s\n”,user->pw_name);g6zLinux联盟
printf(“uid:%d\n”,user->pw_uid);g6zLinux联盟
printf(“home:%s\n”,user->pw_dir);g6zLinux联盟
}g6zLinux联盟
执行
name:rootg6zLinux联盟
uid:0g6zLinux联盟
home:/rootg6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getpwuid(从密码文件中取得指定uid 的数据)
相关函数
getpw,fgetpwent,getpwent,getpwnamg6zLinux联盟
表头文件
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
struct passwd * getpwuid(uid_t uid);g6zLinux联盟
函数说明
getpwuid()用来逐一搜索参数uid 指定的用户识别码,找到时便将该用户的数据以结构返回结构请参考将该用户的数据以passwd 结构返回。passwd 结构请参考getpwent()。g6zLinux联盟
返回值
返回passwd 结构数据,如果返回NULL 则表示已无数据,或者有错误发生。g6zLinux联盟
范例
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct passwd *user;g6zLinux联盟
user= getpwuid(6);g6zLinux联盟
printf(“name:%s\n”,user->pw_name);g6zLinux联盟
printf(“uid:%d\n”,user->pw_uid);g6zLinux联盟
printf(“home:%s\n”,user->pw_dir);g6zLinux联盟
}g6zLinux联盟
执行
name:shutdowng6zLinux联盟
uid:6g6zLinux联盟
home:/sbing6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getuid(取得真实的用户识别码)
相关函数
geteuid,setreuid,setuidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
uid_t getuid(void);g6zLinux联盟
函数说明
getuid()用来取得执行目前进程的用户识别码。g6zLinux联盟
返回值
用户识别码g6zLinux联盟
范例
main()g6zLinux联盟
{ g6zLinux联盟
printf(“uid is %d\n”,getuid());g6zLinux联盟
}g6zLinux联盟
执行
uid is 0 /*当使用root身份执行范例程序时*/g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getutent(从utmp 文件中取得账号登录数据)
相关函数
getutent,getutid,getutline,setutent,endutent,pututline,utmpnameg6zLinux联盟
表头文件
#include<utmp.h>g6zLinux联盟
定义函数
struct utmp *getutent(void);g6zLinux联盟
函数说明
getutent()用来从utmp 文件(/var/run/utmp)中读取一项登录数据,该数据以utmp 结构返回。第一次调用时会取得第一位用户数据,之后每调用一次就会返回下一项数据,直到已无任何数据时返回NULL。g6zLinux联盟
utmp结构定义如下g6zLinux联盟
struct utmpg6zLinux联盟
{g6zLinux联盟
short int ut_type; /*登录类型*/g6zLinux联盟
pid_t ut_pid; /*login进程的pid*/g6zLinux联盟
char ut_line[UT_LINESIZE];/*登录装置名,省略了“/dev/”*/g6zLinux联盟
char ut_id[4]; /* Inittab ID*/g6zLinux联盟
char ut_user[UT_NAMESIZE];/*登录账号*/g6zLinux联盟
char ut_host[UT_HOSTSIZE];/*登录账号的远程主机名称*/g6zLinux联盟
struxt exit_status ut_exit;/* 当类型为DEAD_PROCESS时进程的结g6zLinux联盟
束状态*/g6zLinux联盟
long int ut_session; /*Sessioc ID*/g6zLinux联盟
struct timeval ut_tv; /*时间记录*/g6zLinux联盟
int32_t ut_addr_v6[4]; /*远程主机的网络地址*/g6zLinux联盟
char __unused[20]; /* 保留未使用*/g6zLinux联盟
};g6zLinux联盟
ut_type有以下几种类型:g6zLinux联盟
EMPTY 此为空的记录。g6zLinux联盟
RUN_LVL 记录系统run-level的改变g6zLinux联盟
BOOT_TIME 记录系统开机时间g6zLinux联盟
NEW_TIME 记录系统时间改变后的时间g6zLinux联盟
OLD_TINE 记录当改变系统时间时的时间。g6zLinux联盟
INIT_PROCESS 记录一个由init衍生出来的进程。g6zLinux联盟
LOGIN_PROCESS 记录login进程。g6zLinux联盟
USER_PROCESS 记录一般进程。g6zLinux联盟
DEAD_PROCESS 记录一结束的进程。g6zLinux联盟
ACCOUNTING 目前尚未使用。g6zLinux联盟
exit_status结构定义g6zLinux联盟
struct exit_statusg6zLinux联盟
{g6zLinux联盟
short int e_termination; /*进程结束状态*/g6zLinux联盟
short int e_exit; /*进程退出状态*/g6zLinux联盟
};g6zLinux联盟
timeval的结构定义请参考gettimeofday()。g6zLinux联盟
相关常数定义如下:g6zLinux联盟
UT_LINESIZE 32g6zLinux联盟
UT_NAMESIZE 32g6zLinux联盟
UT_HOSTSIZE 256g6zLinux联盟
返回值
返回utmp 结构数据,如果返回NULL 则表示已无数据,或有错误发生。g6zLinux联盟
附加说明
getutent()在第一次调用时会打开utmp 文件,读取数据完毕后可使用endutent()来关闭该utmp文件。g6zLinux联盟
范例
#include<utmp.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct utmp *u;g6zLinux联盟
while((u=getutent())){g6zLinux联盟
if(u->ut_type = = USER_PROCESS)g6zLinux联盟
printf(“%d %s %s %s \n”,u->ut_type,u->ut_user,u->ut_line,u->ut_host);g6zLinux联盟
}g6zLinux联盟
endutent();g6zLinux联盟
}g6zLinux联盟
执行
/* 表示有三个root账号分别登录/dev/pts/0,/dev/pts/1,/dev/pts/2 */g6zLinux联盟
7 root pts/0g6zLinux联盟
7 root pts/1g6zLinux联盟
7 root pts/2g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getutid(从utmp 文件中查找特定的记录)
相关函数
getutent,getutlineg6zLinux联盟
表头文件
#include<utmp.h>g6zLinux联盟
定义函数
strcut utmp *getutid(strcut utmp *ut);g6zLinux联盟
函数说明
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()。g6zLinux联盟
返回值
返回utmp 结构数据,如果返回NULL 则表示已无数据,或有错误发生。g6zLinux联盟
范例
#include<utmp.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct utmp ut,*u;g6zLinux联盟
ut.ut_type=RUN_LVL;g6zLinux联盟
while((u= getutid(&ut))){g6zLinux联盟
printf(“%d %s %s %s\n”,u->ut_type,u->ut_user,u->ut_line,u->ut_host);g6zLinux联盟
}g6zLinux联盟
}g6zLinux联盟
执行
1 runlevel -g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
getutline(从utmp 文件中查找特定的记录)
相关函数
getutent,getutid,pututlineg6zLinux联盟
表头文件
#include<utmp.h>g6zLinux联盟
定义函数
struct utmp * getutline (struct utmp *ut);g6zLinux联盟
函数说明
getutline()用来从目前utmp文件的读写位置逐一往后搜索ut_type为USER_PROCESS 或LOGIN_PROCESS 的记录,而且ut_line 和ut->ut_line 相符。找到相符的记录便将该数据以utmp 结构返回,utmp结构请参考getutent()。g6zLinux联盟
返回值
返回utmp 结构数据,如果返回NULL 则表示已无数据,或有错误发生。g6zLinux联盟
范例
#include<utmp.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct utmp ut,*u;g6zLinux联盟
strcpy (ut.ut_line,”pts/1”);g6zLinux联盟
while ((u=getutline(&ut))){g6zLinux联盟
printf(“%d %s %s %s \n”,u->ut_type,u->ut_user,u->ut_line,u->ut_host);g6zLinux联盟
}g6zLinux联盟
}g6zLinux联盟
执行
7 root pts/1g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
initgroups(初始化组清单)
相关函数
setgrent,endgrentg6zLinux联盟
表头文件
#include<grp.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
int initgroups(const char *user,gid_t group);g6zLinux联盟
函数说明
initgroups()用来从组文件(/etc/group)中读取一项组数据,若该组数据的成员中有参数user时,便将参数group组识别码加入到此数据中。g6zLinux联盟
返回值
执行成功则返回0,失败则返回-1,错误码存于errno。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
pututline(将utmp 记录写入文件)
相关函数
getutent,getutid,getutlineg6zLinux联盟
表头文件
#include<utmp.h>g6zLinux联盟
定义函数
void pututline(struct utmp *ut);g6zLinux联盟
函数说明
pututline()用来将参数ut的utmp结构记录到utmp文件中。此函数会先用getutid()来取得正确的写入位置,如果没有找到相符的记录则会加入到utmp文件尾,utmp结构请参考getutent()。g6zLinux联盟
返回值
g6zLinux联盟
附加说明
需要有写入/var/run/utmp 的权限g6zLinux联盟
范例
#include<utmp.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct utmp ut;g6zLinux联盟
ut.ut_type =USER_PROCESS;g6zLinux联盟
ut.ut_pid=getpid();g6zLinux联盟
strcpy(ut.ut_user,”kids”);g6zLinux联盟
strcpy(ut.ut_line,”pts/1”);g6zLinux联盟
strcpy(ut.ut_host,”www.gnu.org”);g6zLinux联盟
pututline(&ut);g6zLinux联盟
}g6zLinux联盟
执行
/*执行范例后用指令who -l 观察*/g6zLinux联盟
root pts/0 dec9 19:20g6zLinux联盟
kids pts/1 dec12 10:31(www.gnu.org)g6zLinux联盟
root pts/2 dec12 13:33g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
seteuid(设置有效的用户识别码)
相关函数
setuid,setreuid,setfsuidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
定义函数
int seteuid(uid_t euid);g6zLinux联盟
函数说明
seteuid()用来重新设置执行目前进程的有效用户识别码。在Linux下,seteuid(euid)相当于setreuid(-1,euid)。g6zLinux联盟
返回值
执行成功则返回0,失败则返回-1,错误代码存于errnog6zLinux联盟
附加说明
请参考setuidg6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setfsgid(设置文件系统的组识别码)
相关函数
setuid,setreuid,seteuid,setfsuidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
定义函数
int setfsgid(uid_t fsgid);g6zLinux联盟
函数说明
setfsgid()用来重新设置目前进程的文件系统的组识别码。一般情况下,文件系统的组识别码(fsgid)与有效的组识别码(egid)是相同的。如果是超级用户调用此函数,参数fsgid 可以为任何值,否则参数fsgid必须为real/effective/saved的组识别码之一。g6zLinux联盟
返回值
执行成功则返回0,失败则返回-1,错误代码存于errno。g6zLinux联盟
附加说明
此函数为Linux特有。g6zLinux联盟
错误代码
EPERM 权限不够,无法完成设置。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setfsuid(设置文件系统的用户识别码)
相关函数
setuid,setreuid,seteuid,setfsgidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
定义函数
int setfsuid(uid_t fsuid);g6zLinux联盟
函数说明
setfsuid()用来重新设置目前进程的文件系统的用户识别码。一般情况下,文件系统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的。如果是超级用户调用此函数,参数fsuid可以为任何值,否则参数fsuid必须为real/effective/saved的用户识别码之一。g6zLinux联盟
返回值
执行成功则返回0,失败则返回-1,错误代码存于errnog6zLinux联盟
附加说明
此函数为Linux特有g6zLinux联盟
错误代码
EPERM 权限不够,无法完成设置。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setgid(设置真实的组识别码)
相关函数
getgid,setregid,getegid,setegidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
定义函数
int setgid(gid_t gid);g6zLinux联盟
函数说明
setgid()用来将目前进程的真实组识别码(real gid)设成参数gid值。如果是以超级用户身份执行此调用,则real、effective与savedgid都会设成参数gid。g6zLinux联盟
返回值
设置成功则返回0,失败则返回-1,错误代码存于errno中。g6zLinux联盟
错误代码
EPERM 并非以超级用户身份调用,而且参数gid 并非进程的effective gid或saved gid值之一。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setgrent(从头读取组文件中的组数据)
相关函数
getgrent,endgrentg6zLinux联盟
表头文件
#include<grp.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
void setgrent(void);g6zLinux联盟
函数说明
setgrent()用来将getgrent()的读写地址指回组文件开头。g6zLinux联盟
返回值
g6zLinux联盟
附加说明
请参考setpwent()。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setgroups(设置组代码)
相关函数
initgroups,getgroup,getgid,setgidg6zLinux联盟
表头文件
#include<grp.h>g6zLinux联盟
定义函数
int setgroups(size_t size,const gid_t * list);g6zLinux联盟
函数说明
setgroups()用来将list 数组中所标明的组加入到目前进程的组设置中。参数size为list()的gid_t数目,最大值为NGROUP(32)。g6zLinux联盟
返回值
设置成功则返回0,如有错误则返回-1。g6zLinux联盟
错误代码
EFAULT 参数list数组地址不合法。g6zLinux联盟
EPERM 权限不足,必须是root权限g6zLinux联盟
EINVAL 参数size值大于NGROUP(32)。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setpwent(从头读取密码文件中的账号数据)
相关函数
getpwent,endpwentg6zLinux联盟
表头文件
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
定义函数
void setpwent(void);g6zLinux联盟
函数说明
setpwent()用来将getpwent()的读写地址指回密码文件开头。g6zLinux联盟
返回值
g6zLinux联盟
范例
#include<pwd.h>g6zLinux联盟
#include<sys/types.h>g6zLinux联盟
main()g6zLinux联盟
{g6zLinux联盟
struct passwd *user;g6zLinux联盟
int i;g6zLinux联盟
for(i=0;i<4;i++){g6zLinux联盟
user=getpwent();g6zLinux联盟
printf(“%s :%d :%d :%s:%s:%s\n”,user->pw_name,user->pw_uid,user->pw_gid,g6zLinux联盟
user->pw_gecos,user->pw_dir,user->pw_shell);g6zLinux联盟
}g6zLinux联盟
setpwent();g6zLinux联盟
user=getpwent();g6zLinux联盟
printf(“%s :%d :%d :%s:%s:%s\n”,user->pw_name,user->pw_uid,user->pw_gid,g6zLinux联盟
user->pw_gecos,user->pw_dir,user->pw_shell);g6zLinux联盟
endpwent();g6zLinux联盟
}g6zLinux联盟
执行
root:0:0:root:/root:/bin/bashg6zLinux联盟
bin:1:1:bin:/bing6zLinux联盟
daemon:2:2:daemon:/sbing6zLinux联盟
adm:3:4:adm:/var/admg6zLinux联盟
root:0:0:root:/root:/bin/bashg6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setregid(设置真实及有效的组识别码)
相关函数
setgid,setegid,setfsgidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
定义函数
int setregid(gid_t rgid,gid_t egid);g6zLinux联盟
函数说明
setregid()用来将参数rgid设为目前进程的真实组识别码,将参数egid设置为目前进程的有效组识别码。如果参数rgid或egid值为-1,则对应的识别码不会改变。g6zLinux联盟
返回值
执行成功则返回0,失败则返回-1,错误代码存于errno。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setreuid(设置真实及有效的用户识别码)
相关函数
setuid,seteuid,setfsuidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
定义函数
int setreuid(uid_t ruid,uid_t euid);g6zLinux联盟
函数说明
setreuid()用来将参数ruid 设为目前进程的真实用户识别码,将参数euid 设置为目前进程的有效用户识别码。如果参数ruid 或euid值为-1,则对应的识别码不会改变。g6zLinux联盟
返回值
执行成功则返回0,失败则返回-1,错误代码存于errno。g6zLinux联盟
附加说明
请参考setuid()。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setuid(设置真实的用户识别码)
相关函数
getuid,setreuid,seteuid,setfsuidg6zLinux联盟
表头文件
#include<unistd.h>g6zLinux联盟
定义函数
int setuid(uid_t uid)g6zLinux联盟
函数说明
setuid()用来重新设置执行目前进程的用户识别码。不过,要让此函数有作用,其有效的用户识别码必须为0(root)。在Linux下,当root使用setuid()来变换成其他用户识别码时,root权限会被抛弃,完全转换成该用户身份,也就是说,该进程往后将不再具有可setuid()的权利,如果只是向暂时抛弃root 权限,稍后想重新取回权限,则必须使用seteuid()。g6zLinux联盟
返回值
执行成功则返回0,失败则返回-1,错误代码存于errno。g6zLinux联盟
附加说明
一般在编写具setuid root的程序时,为减少此类程序带来的系统安全风险,在使用完root权限后建议马上执行setuid(getuid());来抛弃root权限。此外,进程uid和euid不一致时Linux系统将不会产生core dump。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
setutent(从头读取utmp 文件中的登录数据)
相关函数
getutent,endutentg6zLinux联盟
表头文件
#include<utmp.h>g6zLinux联盟
定义函数
void setutent(void);g6zLinux联盟
函数说明
setutent()用来将getutent()的读写地址指回utmp文件开头。g6zLinux联盟
附加说明
请参考setpwent()或setgrent()。g6zLinux联盟
 
g6zLinux联盟
g6zLinux联盟
g6zLinux联盟
utmpname(设置utmp 文件路径)
相关函数
getutent,getutid,getutline,setutent,endutent,pututlineg6zLinux联盟
表头文件
#include<utmp.h>g6zLinux联盟
定义函数
void utmpname(const char * file);g6zLinux联盟
函数说明
utmpname()用来设置utmp文件的路径,以提供utmp相关函数的存取路径。如果没有使用utmpname()则默认utmp文件路径为/var/run/utmp。g6zLinux联盟
返回值
g6zLinux联盟
g6zLinux联盟
来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目更新
栏目热门