Linux各种ID及其Linux c接口

本文详细解析了Linux系统中文件的各种类型与权限,通过ls-l命令展示文件属性的各个字段含义。此外还介绍了用户ID(UID)、组ID(GID)、进程ID(PID)的概念与作用,并解释了有效ID在进程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


先记录下ls -l命令

ls -l命令

命令详解

字段1-文件类型

“-”表示普通文件;

“d”表示目录;

“l”表示链接文件;

“p”表示管理文件;

“b”表示块设备文件;

“c”表示字符设备文件;

“s”表示套接字文件;

字段2-文件权限

r(Read,读取权限):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。

w(Write,写入权限):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。

x(eXecute,执行权限):对文件而言,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。
第一段表示文件创建者/所有者对该文件所具有的权限,第二段表示创建者/所有者所在的组的其他用户所具有的权限,第三段表示其他组的其他用户所具有的权限。

字段3-目录/链接个数

该字段表示此文件是属于哪个用户。linux类系统都是多用户系统,每个文件都有它的拥有者。只有文件的拥有者才具有改动文件属性的权利。当然, root用户具有改动任何文件属性的权利。对于一个目录来说,只有拥有该目录的用户,或者具有写权限的用户才有在目录下创建文件的权利。

对于目录文件,表示它的第一级子目录的个数。注意此处看到的值要减2才等于该目录下的子目录的实际个数。

字段4、5-所有者及组

该文件的所有者/创建者(owner)及其所在的组(group)。一个用户可以加入很多个组,但是其中有一个是主组。

字段6-文件大小

如果是文件,则表示该文件的大小,单位为字节。

如果是目录,则表示该目录符所占的大小,并不表示该目录下所有文件的大小。请注意是文件夹本身的大小,而不是文件夹以及它下面的文件的总大小。我的设备ubuntu是4096.

字段7-修改日期

文件最后修改的日期时间

字段8-文件名称,字体颜色

如果是一个符号链接,那么会有一个 “->" 箭头符号,后面根一个它指向的文件名;

灰白色表示普通文件;

亮绿色表示可执行文件;

亮红色表示压缩文件;

灰蓝色表示目录;

亮蓝色表示链接文件;

亮黄色表示设备文件;

用户ID

UID、GID与附加组id

  1. UID:用户ID
  2. GID:主要组ID
  3. 附加组ID:不是主要组的其他附属组ID
#Linux id命令用于显示用户的ID,以及所属群组的ID。
id [-gGnru][--help][--version][用户名称]
-g或--group  显示用户所属群组的ID。
-G或--groups  显示用户所属附加群组的ID。
-n或--name  显示用户,所属群组或附加群组的名称。
-r或--real  显示实际ID。
-u或--user  显示用户ID。
-help  显示帮助。
-version  显示版本信息。

私有组主要组与附加组

任何用户都必须依赖一个用户组才能存在,所以如果我们在创建用户的时候没有指定用户组,那么系统会为该用户创建一个同名的组。 这个组叫做私有组。一般来讲,在创建用户的时候没有指定用户组的用户的主要组也是同名的私有组。
在/etc/passwd的第四列GID表示该用户的主要组(primary group),一个 用户可以属于多个组,记录在/etc/passwd 的那个组叫主要组。
一个用户只可以属于一个私有组,但是可以同时属于多个附加组
一般linux命令行里 -g表示主要组 -G表示附加组

进程ID

UID、EUID、GID和EGID

https://blog.csdn.net/weixin_42072280/article/details/88657563
进程拥有所属用户的ID及有效ID,如下

  1. UID:真实用户ID
  2. EUID:有效用户ID
  3. GID:真实组ID
  4. EGID:有效组ID

区别

//linux c接口
#include<sys/types.h>
#include<unistd.h>
uid_t getuid();/*获取真实用户ID*/
uid_t geteuid();/*获取有效用户ID*/
gid_t getgid();/*获取真实组ID*/
gid_t getegid();/*获取有效组ID*/
int setuid(uid_t uid);/*设置真实用户ID*/
int seteuid(uid_t uid);/*设置有效用户ID*/
int setgid(gid_t gid);/*设置真实组ID*/
int setegid(gid_t gid);/*设置有效组ID*/

切换用户实例

static bool switch_to_user( uid_t user_id, gid_t gp_id )
{
    if ( ( user_id == 0 ) && ( gp_id == 0 ) )
    {
        return false;
    }

    gid_t gid = getgid();
    uid_t uid = getuid();
    if ( ( ( gid != 0 ) || ( uid != 0 ) ) && ( ( gid != gp_id ) || ( uid != user_id ) ) )
    {
        return false;
    }

    if ( uid != 0 )
    {
        return true;
    }

    if ( ( setgid( gp_id ) < 0 ) || ( setuid( user_id ) < 0 ) )
    {
        return false;
    }

    return true;
}

PID PPID PGID

PID是程序被操作系统加载到内存成为进程后动态分配的资源。
每次程序执行的时候,操作系统都会重新加载,PID在每次加载的时候都是不同的。
PPID是程序的父进程号。
1、所有进程追溯其祖先最终都会落到进程号为1的进程身上,这个进程叫init进程
2、init进程是linux内核启动后第一个执行的进程。
3、init引导系统,启动守护进程并且运行必要的程序。
4、对于一个普通的用户进程,它的父进程就是执行它的哪个Shell,对于Linux而言,Shell就是bash。

进程可以组成进程组(setpgrp系统调用),进程组可以简化向所有组内进程发送信号的操作。进程组ID叫做PGID,进程组内的所有进程都有相同的PGID,等于该组组长的PID。

#include<unistd.h>

//得到进程的PID:
pid_t getpid(void);

//得到进程的PPID:
pid_t getppid(void);

//得到进程的PGID:
pid_t getpgid(pid_t pid);

bash里面可使用ps |grep 来获取id

用户执行进程过程

http://blog.chinaunix.net/uid-28541347-id-4242246.html
过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值