Linux系统编程27 系统数据文件和信息 - /etc/passwd 用户信息文件和函数 getpwuid() getpwnam()

一 、/etc/passwd

我们发现
ls -l 显示线程的 user名 和 group名
ls -n 显示线程的 user id 和 group id

mhr@ubuntu:~$ ls -l
total 52
drwxr-xr-x 3 mhr mhr 4096 Sep  2  2019 Desktop
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Documents
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Downloads
-rw-r--r-- 1 mhr mhr 8980 Sep  2  2019 examples.desktop
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Music
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Pictures
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Public
drwxrwxr-x 2 mhr mhr 4096 Nov  9  2019 shiyan
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Templates
drwxr-xr-x 2 mhr mhr 4096 Sep  2  2019 Videos
drwxrwxr-x 8 mhr mhr 4096 Apr 16 08:17 work
mhr@ubuntu:~$ 
mhr@ubuntu:~$ 
mhr@ubuntu:~$ ls -n
total 52
drwxr-xr-x 3 1000 1000 4096 Sep  2  2019 Desktop
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Documents
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Downloads
-rw-r--r-- 1 1000 1000 8980 Sep  2  2019 examples.desktop
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Music
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Pictures
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Public
drwxrwxr-x 2 1000 1000 4096 Nov  9  2019 shiyan
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Templates
drwxr-xr-x 2 1000 1000 4096 Sep  2  2019 Videos
drwxrwxr-x 8 1000 1000 4096 Apr 16 08:17 work
mhr@ubuntu:~$ 

但我们自己实现 ls 系列命令的时候,需要使用 user名 和 group名,user id 和 group id 等信息,那这些信息存储在什么位置呢? 在 linux,unix系统中 这些信息存储在 /etc/passwd 中而在 FreeBSD系统上,这些信息存储在一个数据库中。在HPUnix系统中,这些信息存储在文件系统中。

在这里插入图片描述

mhr❌1000:1000:MHR,:/home/mhr:/bin/bash,
所以在 unix,linux 系统中 可以查找 /etc/passwd文件中的对应用户名或di 等信息。

在这里插入图片描述

那么各个系统 存储 上述信息的位置不一样,用户使用就比较麻烦,所以就有了标准,标准就出来和稀泥了~
标准说:既然你们对这些信息的存储的实现都不一样,那么我就统一一下标准实现吧。

getpwuid()
getpwnam()

NAME
getpwnam, getpwnam_r, getpwuid, getpwuid_r - get password file entry
通过 uid 或者 user name 来查询用户信息。
SYNOPSIS
#include <sys/types.h>
#include <pwd.h>

struct passwd *getpwnam(const char *name);
struct passwd *getpwuid(uid_t uid);

   The passwd structure is defined in <pwd.h> as follows:

       struct passwd {
           char   *pw_name;       /* username */
           char   *pw_passwd;     /* user password */
           uid_t   pw_uid;        /* user ID */
           gid_t   pw_gid;        /* group ID */
           char   *pw_gecos;      /* user information */
           char   *pw_dir;        /* home directory */
           char   *pw_shell;      /* shell program */
       };

注意不同系统的 passed 中的字段可能不一样,具体需要看手册!

实验1 :使用 getpwuid() 获取 passwd相关信息

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <pwd.h>

int main(int argc,char *argv[])
{
	struct passwd *pwdline;
	if(argc < 2)
	{
		fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
		exit(1);
	}

	//atoi() : string --> int 转换
	pwdline = getpwuid(atoi(argv[1]));

	//puts string  打印用户名,打印字符换 直接而用 puts()
	puts(pwdline->pw_name);

	exit(0);
}


mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ gcc getpwuid.c 
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ 
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ ./a.out 1000
mhr //我自己
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ 
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ 
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ ./a.out 0
root // uid 为0  是 root 用户
mhr@ubuntu:~/work/linux/muluheyonghucaozuo/27$ 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科尔沁第一狠人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值