c - 如何使用手册 2 页中列出的系统调用从 uid 和 gid 中查找所有者和组名?

标签 c linux unix

我有一个作业,其中我必须使用 C 模拟 ls -l unix 命令。除了找到特定文件的所有者和组之外,我已经弄清楚了所有的事情。我使用 stat() 系统调用从 stat 结构中获得了 uid 和 gid,但我无法将它们分别映射到用户和所有者的实际名称。我应该只使用手册 2 页中列出的那些系统调用。我试过寻找答案,但到处都说要使用 getpwnam() 调用,我不能这样做,因为它没有在手册 2 页中列出。

最佳答案

是的,getpwnam(3)getgrnam(3) 是您在设置中执行此操作的方式,不仅限于系统调用。

但即使仅使用系统调用读取 /etc/passwd 的内容也会带来一两个挑战。像 fopen(3)fread(3)fgets(3) 这样的普通 friend 不可用,像 这样的字符串助手也不可用>strsep(3)。我猜你被 read(2) 困住了。您可以使用 read(2) 一次读取一个字符,并以这种方式对内容进行粗略的解析。

或者您可以设置一个足够大的字符数组,以将所有 /etc/passwd 读入内存,然后以这种方式遍历文件内容。您将返回 stat(2) 信息以告知 /etc/passwd 有多大,因此如果它对于您的假设而言太大可能会失败,或者实现缓冲自己制定策略。

或者您可以查看 sbrk(2),并确保您有足够的内存从一个 将所有 /etc/passwd 放入内存中阅读(2)

无论您如何阅读内容,您都需要将文本(数字字符串)转换为 C 数字类型,当 atoi(3) 不可用时会更难。

同样有趣:将 time_t(time(2) 输出;还有 struct stat 的一些字段)转换为一个漂亮的字符串:

1409264099 -> 2014 年 8 月 28 日星期四 17:14:59

这些真的是作业规则吗……?如果没有传统的 libc...

,C 就足够粗糙了

关于c - 如何使用手册 2 页中列出的系统调用从 uid 和 gid 中查找所有者和组名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25558004/

相关文章:

c - 读取指针声明

linux - 如何使用输入的 txt 文件将 AAC 文件与 AVCONV CONCAT 连接起来?

linux - 如何使用多个正则表达式在 Solaris 中查找文件

linux - Sed 在模式上多次插入行

c - 网络上是否有任何交互式工具可以理解通用代码库?

数组编译错误?

c - 在linux下的c中从文件到文件读写直到EOF

c - 访问另一台机器中的设备

linux - 无法在 Amazon Centos 上编译 QT 5.5.1 : Project ERROR: Unknown module(s) in QT: quick

mysql - 为什么将二进制文本通过管道传输到屏幕通常会导致终端崩溃