52、 chmod a+rX file 命令为所有用户类别启用读权限,如果文件是目录或者文件的任何用户类别已启用执行权限,则同样为所有用户类别启用执行权限。编写一个使用 stat() 和 chmod() 来实现与 chmod a+rX 等效功能的程序。
下面是给定的【文本内容】:
可编写如下示例程序实现 chmod a+rX 的功能:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>", argv[0]);
return 1;
}
struct stat sb;
if (stat(argv[1], &sb) == -1) {
perror("stat");
return 1;
}
mode_t mode = sb.st_mode;
mode |= S_IRUSR | S_IRGRP | S_IROTH; // 为所有用户类别启用读权限
if (S_ISDIR(mode) || (mode & (S_IXUSR | S_IXGRP | S_IXOTH))) {
mode |= S_IXUSR | S_IXGRP | S_IXOTH; // 如果是目录或者任何用户类别有执行权限,为所有用户类别启用执行权限
}
if (chmod(argv[1], mode) == -1) {
perror("chmod");
return 1;
}
return 0;
}
该程序首先使用 stat() 获取文件的状态信息,然后根据文件是否为目录或者是否有任何用户类别有执行权限,修改文件的权限模式,最后使用 chmod() 更新文件的权限。
53、在执行文件时,通常不能以写入模式打开该文件(open()返回 -1,errno被设置为ETXTBSY)。然而,在shell中可以执行以下操作:$ cc -o longrunner longrunner.c $ ./longrunner & (让其在后台运行)$ vi longrunner.c (对源代码进行一些修改)$ cc -o longrunner longrunner.c 最后一条命令会覆盖同名的现有可执行文件。这是如何实现的呢?(提示:使用ls –li查看每次编译后可执行文件的i - 节点编号)
可通过使用 ls –li 查看每次编译后可执行文件的 i-节点编号来寻找线索。通常,这可能是因为文件系统允许在文件被执行时替换其内容,新生成的可执行文件可能有新的 i-节点,而正在执行的程序继续使用旧的 i-节点对应的文件映像。
54、实现 realpath() 函数。
`realpath()` 库函数会对路径名中的所有符号链接进行解引用,并解析所有对 `/.` 和 `/..` 的引用,以生成一个包含对应绝对路径名的以空字符结尾的字符串。
在 glibc 实现中,若 `resolved_path` 为 `NULL`,函数会分配一个最大为 `PATH_MAX` 字节的缓冲区来存储解析后的路径名。
实现 `realpath()` 的大致步骤如下:
1. 检查路径名是否为绝对路径,若不是则转换为绝对路径。
2. 处理路径名中的 `/.` 和 `/..` 引用。
3. 对路径名中的符号链接进行解引用。
4. 存储解析后的路径名到缓冲区。
以下是一个简单的伪代码示例:
```python
def realpath(pathname, resolved_path=None):
# 检查 resolved_path 是否为 None
if resolved_path is None:
resolved_path = [0] * PATH_MAX
# 处理路径名
# 转换为绝对路径
# 处理 /. 和 /.. 引用
# 解引用符号链接
# 存储解析后的路径名到 resolved_path
return resolved_path
注意,这只是一个简单示例,实际实现会更复杂,需考虑错误处理、符号链接循环等问题。
##55、实现一个与 getcwd() 功能等效的函数。解决此问题的一个有用提示是,你可以使用 opendir() 和 readdir() 遍历父目录(..)中的每个条目,以找到与当前工作目录具有相同 i - 节点和设备编号的条目(即 stat() 和 lstat() 返回的 stat 结构中的 st_ino 和 st_dev 字段)。因此,可以通过一次向上遍历一级目录树(chdir(“..”))并进行此类扫描来构建目录路径。当父目录与当前工作目录相同时,遍历可以结束(回想一下,/.. 与 / 相同)。无论你的 getcwd() 函数成功还是失败,调用者都应留在其开始的同一目录中(open(

最低0.47元/天 解锁文章
605

被折叠的 条评论
为什么被折叠?



