先看main.c,
同样,先定义一个struct rm_options,用于存储命令选项,
先初始化
rm_option_init (&x);
接着,分析选项,向结构体赋值。
while ((c = getopt_long (argc, argv, "dfirvR", long_opts, NULL)) != -1)
{
switch (c)
{
case 0: /* Long option. */
break;
case 'd':
x.unlink_dirs = 1;
break;
接着,分析选项,向结构体赋值。
while ((c = getopt_long (argc, argv, "dfirvR", long_opts, NULL)) != -1)
{
switch (c)
{
case 0: /* Long option. */
break;
case 'd':
x.unlink_dirs = 1;
break;
我不拷太多,看不清。
接着,进行关键
enum RM_status status = rm (n_files, file, &x);
注意,把要删除的文件全部放到数组file中了。上面有一句
*file = (char const *const *) argv + optind;
接着跑到rm中,
在rm (size_t n_files, char const *const *file, struct rm_options const *x)
中有如下一段:
for (i = 0; i < n_files; i++)
{
enum RM_status s = rm_1 (file[i], x, &cwd_state);
assert (VALID_STATUS (s));
UPDATE_STATUS (status, s);
}
那rm_1也不是删除呀,再找
status = remove_entry (filename, x, NULL);
再去找remove_entry,其中有一句:
DO_UNLINK (filename, x);
也就是,通过调用unlink来删除文件,因为目录中是
inode:文件名
把某个文件和某个inode不再关联,就删除了,先看大概吧
接着,进行关键
enum RM_status status = rm (n_files, file, &x);
注意,把要删除的文件全部放到数组file中了。上面有一句
*file = (char const *const *) argv + optind;
接着跑到rm中,
在rm (size_t n_files, char const *const *file, struct rm_options const *x)
中有如下一段:
for (i = 0; i < n_files; i++)
{
enum RM_status s = rm_1 (file[i], x, &cwd_state);
assert (VALID_STATUS (s));
UPDATE_STATUS (status, s);
}
那rm_1也不是删除呀,再找
status = remove_entry (filename, x, NULL);
再去找remove_entry,其中有一句:
DO_UNLINK (filename, x);
也就是,通过调用unlink来删除文件,因为目录中是
inode:文件名
把某个文件和某个inode不再关联,就删除了,先看大概吧