您的位置:首页 > 其它

gnu coreutils rm.c 源码分析

2018-03-07 11:44 417 查看
先看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;我不拷太多,看不清。
接着,进行关键
  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不再关联,就删除了,先看大概吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: