预备知识:
1.系统调用getpid可以得到进程的ID,而getppid可以得到父进程(创建调用该函数进程的进程)的ID.
#include <unistd>;
pid_t getpid(void);
pid_t getppid(void);
2.通过系统调用getuid可以得到进程的所有者的ID.由于进程要用到一些资源,而Linux对系统资源是进行保护的,为了获取一定资源进程还有一个有效用户ID.这个ID和系统的资源使用有关,涉及到进程的权限. 通过系统调用geteuid我们可以得到进程的有效用户ID. 和用户ID相对应进程还有一个组ID和有效组ID系统调用getgid和getegid可以分别得到组ID和有效组ID
#include <unistd>;
#include <sys/types.h>;
uid_t getuid(void);
uid_t geteuid(void);
gid_t getgid(void);
git_t getegid(void);
3.有时候我们还会对用户的其他信息感兴趣(登录名等等),这个时候我们可以调用getpwuid来得到.
struct passwd {
char *pw_name; /* 登录名称 */
char *pw_passwd; /* 登录口令 */
uid_t pw_uid; /* 用户ID */
gid_t pw_gid; /* 用户组ID */
char *pw_gecos; /* 用户的真名 */
char *pw_dir; /* 用户的目录 */
char *pw_shell; /* 用户的SHELL */
};
#include <pwd.h>;
#include <sys/types.h>;
struct passwd *getpwuid(uid_t uid);
下面将通过一个程序实例来实践上面所列的函数:
#include <stdio.h>
#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char **argv)
{
pid_t my_pid,myparent_pid;
uid_t my_uid,my_euid;
gid_t my_gid,my_egid;
struct passwd *my_info;
my_pid = getpid();
myparent_pid = getppid();
my_uid = getuid();
my_euid = geteuid();
my_gid = getgid();
my_egid = getegid();
my_info = getpwuid(my_uid);
printf("Process ID:%ld\n",my_pid);
printf("Parent ID:%ld\n",myparent_pid);
printf("User ID:%ld\n",my_uid);
printf("Effective User ID:%ld\n",my_euid);
printf("Group ID:%ld\n",my_gid);
printf("Effective Group ID:%ld\n",my_egid);
if(my_info)
{
printf("My Login Name:%s\n",my_info->pw_name);
printf("My Login Password:%s\n",my_info->pw_passwd);
printf("My User ID:%ld\n",my_info->pw_uid);
printf("My Group ID:%ld\n",my_gid);
printf("My Real Name:%s\n",my_info->pw_gecos);
printf("My Home Directory:%s\n",my_info->pw_dir);
printf("My Work Shell:%s\n",my_info->pw_shell);
}
}
|
下面是程序运行的结果:
Process ID:3574
Parent ID:2721
User ID:1000
Effective User ID:1000
Group ID:1000
Effective Group ID:1000
My Login Name:longmenyu
My Login Password:x
My User ID:1000
My Group ID:1000
My Real Name:longmenyu,,,
My Home Directory:/home/longmenyu
My Work Shell:/bin/bash