gnu coreutils rm.c 源码分析


先看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不再关联,就删除了,先看大概吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值