实现linux touch 命令及 文件权限的由来

一、函数介绍 

  ①open---打开或创建一个文件

    open(char *, flag, mode)在fcntl.h声明中。最多有三个参数:

      功能:打开或创建一个文件

      参数:第一个参数,char * 包含有文件名和路径

         第二个参数,flag      打开文件参数

         第三个参数,mode   创建文件和权限

         flag内容:  flag              |  功能

                 O_RDONLY    |  只读

               O_WRONLY   |  只写 

               O_RDWR   |  读写

               O_CREAT      |   创建一个文件

               O_EXCL        |   如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。

               O_TRUNC  | 打开文件(会把已经存在的内容给删除) 

               O_APPEND  |  追加方式打开文件(不会把已经存在的内容删除)

      返回值:成功---返回文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;

          出错---返回-1

二、代码示例

/*
   功能:创建一个文件 
*/
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
     int fd = open(argv[1], O_CREAT | O_RDWR, 0777);
     if(fd < 0 )
     {
          printf("creat file %s failed!\n", argv[1]);
          return -1;
     }      
     printf("create file %s failed!, fd = %d\n", argv[1], fd);
     close(fd);
     return 0;           
}

 三、结果展示

  

  如上图所示:我们实现了和touch一样的功能,此时可以看出我们生成的文件权限为755

  ① 生成的文件权限值是怎么来的呢?

   我们代码中写的权限是777,我们生成文件的权限是755,说明这和代码中写的权限没有关系

       生成文件的权限=mode & (~umask)

   首先查看我们linux下的umask值:

   

   可以看到我们umask值是022,前面第一个0代表八进制

   将它们转换为二进制:

     777 ---- 111  111  111

     022 ---- 000  010  010

    umask取反111 101  101

    最后跟前面777的二进制作与运算,结果为:111 101 101,即755

               

                

转载于:https://www.cnblogs.com/jiangson/p/6070234.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值