我有一个作业,其中我必须使用 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 - 如何使用手册 2 页中列出的系统调用从 uid 和 gid 中查找所有者和组名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25558004/