linux系统编程1--文件编程open和close

1、C语言的fopen和fclose函数

#include <stdio.h>
int main()
{
    char ch;
    FILE *fp=fopen("/root/sh.txt","a");
      if(fp!=NULL)
        { 
        fputs("i love biancheng\n",fp); 
        }
    fclose(fp);
       printf("ok\n"); 
    return 0;
}

使用vi编辑器创建文件write.c,然后输入上面内容,这里的代码就是C语言实现了文件的创建,采用的是a,即追加模式,不管/root/sh.txt文件有没有,有则追加,无则创建,然后向文件添加一个字符串内容i love biancheng,保存退出后,使用gcc编译,然后运行,结果如下:

文件内容写入成功,然后进行读取文件内容,vi read.c编写以下代码

#include <stdio.h>
int main()
{
    char str[101];
    FILE *fp=fopen("/root/sh.txt","r");
       if(fp!=NULL)
        { 
       while(fgets(str,100,fp)!=NULL)
       {
             printf("%s",str);
           }
        }
    fclose(fp);
       printf("ok\n"); 
    return 0;
}

这里的代码就是打开上面创建的文件,然后以字符串读取内容并输出,最后关闭,编译,执行,效果如下:

2、系统调用

什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface, API)。是应用程序同系统之间数据交互的桥梁。

C 标准函数和系统函数调用关系。一个 helloworld 如何打印到屏幕

c库函数与系统函数的关系

3、Linux系统的open和close函数

1、open函数创建及打开文件

系统调用提供了open函数,open函数在打开不存在的文件时候允许创建,同时提供了两种实现方式,这两种区别在于创建的文件是否可以写入指定权限。

1.open函数原型:int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

2.参数1:const char *pathname,该文件路径;

参数2:int flags, 打开文件的三种模式O_RDONLY(可读), O_WRONLY(可写), O_RDWR(可读可写),三者选其一,另外,选择以上其中一个参数后还可以选以下参数:

O_CREAT 若文件不存在则创建它。使用此选项时,需同时说明参数3mode,其

说明该新文件的存取许可权限;

O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则返回-1;

O_APPEND 每次写时都加到文件尾端;

O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或者

只写成功打开,则将其长度截短为0。

3.返回值:如果文件成功创建或打开则返回文件对应的文件描述符(大于0的整数),否则返

回-1。(其中linux系统中默认0-标准输入,1-标准输出,2-标准错误)

4.包含特定头文件:#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

1.1普通打开

函数

int open(char *pathname, int flags)

参数

pathname:要打开的文件路径名

flags:文件打开方式,O_RDONLY(可读), O_WRONLY(可写), O_RDWR(可读可写)

返回值

成功: 打开文件所得到对应的文件描述符(整数)失败: -1, 设置errno

体验一下,用vi open.c,输入以下代码

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
 int fd; 
 fd=open("/root/sh.txt",O_RDONLY);
  if(fd==-1)
  {
   printf("fd=%d,fail\n",fd); 
  }
  else
  {
    printf("fd=%d,success\n",fd); 
  } 
 return 0;
}

gcc编译执行,结果如下:

1.2 指定权限打开

函数

int open(char *pathname, int flags, mode_t mode)

参数

pathname:要打开的文件路径名

flags:文件打开方式

O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK…

mode:参数3使用的前提, 参数2指定了 O_CREAT,取值8进制数,用来描述文件的访问权限,如: rwx 0664,创建文件最终权限 = mode & ~umask

返回值

成功: 打开文件所得到对应的文件描述符(整数)

失败: -1, 设置errno

第3个参数mode_t mode权限设置用的八进制处理,详细对照表:

体验一下,用vi open2.c,输入以下代码

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
 int fd; 
 fd=open("/root/sh2.txt",O_RDONLY);
 if(fd==-1)
 { 
   printf("fd=%d,fail\n",fd);
   fd=open("/root/sh2.txt",O_CREAT,0777);
   if(fd!=-1)
    {
    printf("fd=%d,success\n",fd);
    }
 } 
 return 0;
}

gcc编译通过,执行,效果如下:

发现一个问题了吧,代码中指定权限是777,为何最后权限是755?代码中指定权限是777,为何最后权限是755?其中奥秘是:创建文件最终权限 = mode & ~umask。

1、umask详解

umask(user file-creatiopn mode mask)是linux中的一个命令,用于为用户文件创建权限掩码,语法“umask [-S][权限掩码]”;其中,“权限掩码”是由3个八进制的数字所组成,查看umask 命令为: umask,

2、mode & ~umask详解

~umask的意思是将umask取反,0022是8进制,要转成2进制,根据

0022转成2进制是将每个8进制的数都要用3位的2进制表示,即8进制的2转成2进制是010,所以0022转成2进制是000000010010,~就是取反操作,000000010010取反就是111111101101,同时在上面例子中,设置的mode是0777,换成2进制是000111111111,&是与运算,01=0,11=1,所以最终权限 = mode & ~umask,即

000 111 111 111

111 111 101 101

&的结果是:000 111 101 101,111是7,101是5,最后就是0755,即755,而755换成的权限就是rwx r-x r-x,所以是:

现在知道了文件最终权限 = mode & ~umask的含义了吗?逼格太屌了。

兔年大旺 金玉满堂

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqwest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值