【lesson33】基础IO之直接使用系统接口和分析系统接口的细节

文章目录

  • 基础IO要讲的知识点介绍
  • 直接使用系统接口和分析系统接口的细节

基础IO要讲的知识点介绍

1.复习一下C语言的接口
2.直接使用系统接口
3.分析系统接口的细节,引入fd(文件描述符)
4.fd的周边问题(fd的理解、fd和file的关系、fd分配规则、fd重定向…)

直接使用系统接口和分析系统接口的细节

其实C语言的库函数底层就是调用了系统函数接口:open
close
read
write
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第1张图片
我们可以看到使用open的传递标志位。
这个标志位,就类似于位图结构。
写代码帮助理解标志位

#include

#define ONE 0x1 //0000 0001
#define TOW 0x2 //0000 0010
#define THREE 0x4 //0000 0100

void show(int flags)
{    
  if(flags & ONE)    
  {    
    printf("Hello ONE\n");    
  }    
  if(flags & TOW)    
  {    
    printf("Hello TOW\n");    
  }    
  if(flags & THREE)    
  {    
    printf("Hello THREE\n");    
  }    
} 

int main()    
{    
  show(ONE);    
  printf("\n");    
  show(TOW);    
  printf("\n");    
  show(THREE);                                                                                                                                                          
  printf("\n");
  show(ONE|TOW);    
  printf("\n");    
  show(ONE|THREE);
  printf("\n");    
  show(TOW|THREE);
  printf("\n");
  show(ONE|TOW|THREE);
  printf("\n");

  return 0;
}

运行代码
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第2张图片
这就是标志位
标志位可以觉得程序什么要运行什么不要运行。

而打开文件就需要这些标志位
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第3张图片

开始进行文件操作
文件操作的逻辑
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第4张图片
我们看到open返回的是一个fd,fd就是文件描述符。
运行代码
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第5张图片
我们看到代码,怎么没有自动创建文件呢?
因为O_WRONLY为只读,想要文件不存在就创建的话的再加上O_CREAT
代码
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第6张图片
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第7张图片
但是我们看到创建出来文件的权限和我们想要的不一样
在这里插入图片描述
那么如何创建一个我们想要的权限文件
我们的用到之前的第二个open
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第8张图片
mode就是设置创建新文件的权限
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第9张图片
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第10张图片
我们发现权限确实和之前不一样了,但是这里的权限也不对啊,这权限是把进行的664啊,并不是我们设置的666,为什么?
因为我们又掩码umask
在这里插入图片描述
umask有的权限,文件中全都不能出现。
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第11张图片
想要权限出现我们的更改umask
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第12张图片
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第13张图片
写文件

#include                                                                                                                                  
#include                                                                                                                                 
#include                                                                                                                                 
#include                                                                                                                              
#include                                                                                                                               
#include                                                                                                                                  
                                                                                                                                                   
int main()                                                                                                                                         
{ 
  //设置掩码初始值                                                                                                                                                 
  umask(0);
  //设置文件初始权限                                                                                                                                        
  mode_t mode = 0666;//八进制表达式                                                                                                                
  //以只读的方式打开文件                                                                                                                           
  int fd = open("log.txt",O_WRONLY|O_CREAT,mode);                                                                                                  
                                                                                                                                                   
  //差错处理                                                                                                                                       
  if(fd < 0)                                                                                                                                       
  {                                                                                                                                                
    //输出打开失败的原因                                                                                                                           
    perror("open");                                                                                                                                
  }                                                                                                                                                
  else                                                                                                                                             
  {                                                                                                                                                
    //打开文件成功,开始进行操作                                                                                                                   
    const char* s1 = "hello world";                                                                                                      
    write(fd,s1,strlen(s1));                                                                                                                                            
  }                                                                                     
   
   //关闭文件                                                                                     
  close(fd);                                                                            
  return 0;                                                                             
}

【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第14张图片
我们更改一点代码,在运行一下
代码

【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第15张图片

运行代码
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第16张图片

我们发现文件内容并没有被清空。
这时我们应该明白只是我们没有添加标志位而已:
常用标志位介绍:
O_RDONLY:以只读方式打开文件
O_WRONLY:以只写的方式打开
O_CREAT:没有文件则创建文件
O_TRUNC:对文件内容清空
O_APPEND:追加内容在文件的后面
演示清空文件内容:
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第17张图片
运行:
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第18张图片
read函数的使用:
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第19张图片
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第20张图片
【lesson33】基础IO之直接使用系统接口和分析系统接口的细节_第21张图片

你可能感兴趣的:(linux,服务器,linux,数据库)