ARM技术论坛
直播中

嵌入式小能手

2年用户 1520经验值
擅长:嵌入式技术
私信 关注
[经验]

飞凌嵌入式ElfBoard-获取文件的状态信息之文件属主

在Linux的文件系统中,文件属主 (Owner)是一个重要的概念,这里属主的通俗解释可以理解为文件的所有者,也就是拥有此文件权限的用户。本质上,每一个文件都有一个所有者,通常就是创建该文件的用户。文件的所有者可以控制文件的访问权限,比如:哪些用户可以控制该文件的访问权限、读写权限或者执行权限。属主通常用用户ID(User ID:UID)表示,在文件系统中,属主的名字也可以通过UID查找。
除了属主之外,文件还会被分配一个用户组。用户组包含了很多个用户,不同的用户组对文件有着不同的权限。用户组用组ID(Group ID:GID)。
所以每一个文件都有一组权限,权限包括属主、属组和其他用户对该文件的访问级别。文件的权限包括读(r)、写(w)、和执行(x)。
下面就以上一小节lstat_test文件为例,看一下文件属主(UID)和用户组(GID)。
  File: lstat_test
  Size: 16272             Blocks: 32         IO Block: 4096   regular file
Device: 803h/2051d        Inode: 5255761     Links: 1
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/     elf)   Gid: ( 1000/ elf)
Access: 2024-11-06 16:58:48.619197176 +0800
Modify: 2024-11-06 16:58:48.619197176 +0800
Change: 2024-11-06 16:58:48.619197176 +0800
Birth: 2024-11-06 16:58:48.608198276 +0800
可以看到lstat_test文件属主是elf,这里的UID是1000,用户组是elf,GID为1000。
在Linux系统中,还有关于有效用户ID(Effective User ID, EUID)和有效组ID(Effective Group ID, EGID)的相关概念,这些都是与进程权限相关的概念。
有效用户ID(EUID)是用于表示进程的当前权限级别,它决定了该进程可以执行哪些操作还有可以访问哪些资源权限。
有效组ID(EGID)是表示当前进程有效组权限,他决定了进程的组权限和对资源的访问。
他们都有一个共同点,都会继承其父进程的有效用户ID(EUID)或者有效组组ID(EGID)。
Chown:用于更改文件或目录的所有者(owner)和所属组(group)的系统调用。它可以修改文件或目录的所有者身份以及该文件的组权限。
1.头文件
#include
2.函数原型
int chown(const char *pathname, uid_t owner, gid_t group);
3.参数
pathname:要更改所有者和所属组的文件路径。
owner:新的文件所有者用户UID,如果希望保持不变可以设置为-1。
group:新的文件所属组GID,如果希望保持不变可以设置为-1。
4.返回值
如果成功则返回0,失败返回-1。
使用此函数还需要注意一下两点:
⚫chown函数需要root权限才可以修改文件的属主和用户组ID。
⚫普通用户可以修改为其所从属的任意附属组ID。
与其相似的还有两个函数,分别为fchown()和lchown()函数,这两个就不做过都介绍了。
5.示例:(使用chown修改文件属组)
#include
#include
#include
#include

int main(){
        const char *pathname = "lstat_test";        //要更改权限文件
        uid_t new_owner = 0;                //新的用户ID
               gid_t new_group = 0;                //新的组ID

        printf("UID : %d  GID : %d\n", getuid(), getgid());

        if (chown(pathname, new_owner, new_group) == -1) {
                perror("chown");
                return 1;
        }

        printf("File ownership change successfully.\n");
        return 0;
}

6.测试结果
$ ./chown_test
UID : 1000  GID : 1000
chown: Operation not permitted
$ sudo ./chown_test
[sudo] password for elf:
UID : 0  GID : 0
File ownership change successfully.
$ stat lstat_test
  File: lstat_test
  Size: 16272             Blocks: 32         IO Block: 4096   regular file
Device: 803h/2051d        Inode: 5255763     Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2024-08-13 14:29:56.236464366 +0800
Modify: 2024-08-22 16:28:05.866155024 +0800
Change: 2024-08-22 16:30:52.964174357 +0800
Birth: 2024-08-13 14:29:56.236464366 +0800
这里执行了两次,第一次没有加sudo权限,可以看到有效用户ID和有效组ID是1000,增加sudo权限后,有效用户ID和有效组ID变成了0。验证了上一小节中“chown函数需要root权限才可以修改文件的属主和用户组ID”的问题。

更多回帖

发帖
×
20
完善资料,
赚取积分