在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具都有哪些权限?

Posted

技术标签:

【中文标题】在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具都有哪些权限?【英文标题】:In C on Unix, how can a process tell what permissions it has to a file without opening it?在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具有哪些权限? 【发布时间】:2010-11-11 10:19:59 【问题描述】:

我可以使用 stat() 来确定所有者、组或其他人拥有哪些权限,并且我可以使用 geteuid() 和 getpwuid() 来获取进程的用户名。我不太确定如何在没有系统调用的情况下获取用户所属的组。

即使知道如何获取这些组,整合所有这些信息似乎也需要做很多工作。有没有更简单的方法?

【问题讨论】:

【参考方案1】:

access() 检查路径参数指向的文件名。这里的缺点是每个文件权限都必须使用下面的标志单独检查。 R_OK 测试读取权限。 W_OK 测试写权限。 X_OK 测试执行或搜索权限。 F_OK 检查文件是否存在

【讨论】:

【参考方案2】:

unistd.h 定义了一个 access() 函数,

int access(const char *path, int amode);

其中 path 是您的文件名,amode 是要检查的访问权限的按位包含 OR。

R_OK、W_OK 和 X_OK 分别保存用于检查读取、写入和搜索/执行权限的模式值。

int readable, readwritable;

//checking for read access
readable = access("/usr/bin/file", R_OK);

//checking for read and write access
readwritable = access("/usr/bin/file", R_OK|W_OK);

您可以在 unix 手册页中找到 access() 的完整描述。

【讨论】:

【参考方案3】:

access() POSIX function 无需打开即可查看权限。但是,它需要一个系统调用。

access() 函数应根据 amode 中包含的位模式检查由 path 参数指向的路径名命名的文件的可访问性,使用真实用户 ID 代替有效用户 ID 和真实组 ID代替有效的组 ID。

例如:

access("/etc/passwd",W_OK)

检查您是否具有对 passwd 文件的写入权限。使用 R_OK,检查读取权限。

eaccess() function(euidaccess 是同义词)使用有效的用户和组 ID。虽然 eaccess 似乎得到了广泛的支持,但据我所知,它不是 POSIX 标准的一部分。

【讨论】:

eaccess 是非标准的,但是 POSIX.1-2008 添加了 faccessat,它可以与标志 AT_EACCESS 一起使用,使用有效 id 执行访问检查。然而,这还没有得到广泛的支持。 opengroup.org/onlinepubs/9699919799/functions/faccessat.html

以上是关于在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具都有哪些权限?的主要内容,如果未能解决你的问题,请参考以下文章

c/c++,mfc:不将打开的文件/句柄传递给生成的进程

UNIX 命令 mv 和 rm 如何处理打开的文件?

UNIX环境高级编程:文件I/O

如何在 Linux/Unix 系统中验证端口是不是打开

Unix系统编程()文件描述符和打开文件之间的关系

如何在unix环境下实现共享内存