Linnux的IO函数 1

1、标准C库的IO函数和Linux的IO函数

1、标准C库的IO函数可以跨平台,调用不同平台的API去打开文件数据先写到缓冲器,再从缓冲器写到磁盘,提高工作效率 BUffer 8192byte,对数据进行读写用标准C库。
2、Linux的IO函数比较偏底层,标准C库的IO函数比较高级网络通信使用Linux系统的IO函数
在这里插入图片描述

2、虚拟地址

虚拟地址空间不存在,内存加载,虚拟地址空间中的数据被CPU的逻辑管理单元MMU映射到物理空间,虚拟地址和物理地址进行转换。
程序:代码
进程:运行中的的程序,加载到内存里面,系统给程序分配资源的最小单位。

在这里插入图片描述
``

3、文件描述符

程序和进程的区别:
程序只占用磁盘的空间,不占内存空间。
进程:给运行程序分配资源。
linux kernel 是一个将程序,文件描述符表是一个数组,用来存储,操作系统对程序进行管理,要有工具,内核相当于程序,PCB进程控制块,存储N个文件描述符,默认大小为1024,最大能打开文件的个数为1024,前三个默认打开。
在这里插入图片描述

4、open打开文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//打开一个已经存在的文件
int open(const char *pathname, int flags);
/*参数:
-pathname:要打开的文件的路径
-flags:对文件的操作权限设置还有其他设置
O_RDONLY, O_WRONLY, O_RDWR 这三个设置是互斥的
返回值:返回一个新的文件描述符,如果调用失败,返回-1
errno:属于Linux系统库,库里面的一个全局变量,记录的最近的错误号

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
int main()
{
   int fd= open("a.txt", O_RDONLY);
   if(fd== -1){
       perror("open");
   }
   //关闭
   close(fd);
    return 0;
}

5、open创建新文件

int open(const char pathname, int flags, mode_t mode);
pathname: 要创建的文件的路径
flags:文件的操作权限和其他设置
- 必选项:O_RDONLY, O_WRONLY, O_RDWR 这三个设置是互斥的
- 可选项: O_CREAT 文件不存在创建新文件
-mode:八进制的数,表示用户对创建的新的操作权限,比如:0775,0表示八进制的数
drwxrwxr-x 2 kekecoder kekecoder 4096 8月 23 16:07
最终的权限: mode & ~umask
0777 -->111 111 111 rwx 111=7 ,全有权限777,umask为0022
& 0755 -->111 101 101
---------------------------
111 101 101 结果为0775
umask作用是抹去某些权限
flags 参数是一个int 类型的数据,占4个字节,32位
flags 32个位,每一个位就是一个标志位
-rwxr-xr-x 1 kekecoder kekecoder 8392 8月 23 16:43 create

抹去了写的权限


#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
int main()
{ 
    //创建一个新的文件
   int fd= open("create.txt", O_RDWR | O_CREAT,0777);
   if(fd== -1){
       perror("open");
   }
   //关闭
   close(fd);
    return 0;
}

6、read、write 函数

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数:
-fd: 文件描述符,open得到,通过文件描述符操作某个文件
-buf: 需要读取数据存放的地方,数组地址(传出参数)
-count: 指定的数组的大小
返回值:
-成功:
>0:返回实际的读取的字节数
=0:文件已经读取完
-失败:-1,并设置error
ssize_t write(int fd, const void *buf, size_t count);
参数:
-fd: 文件描述符,open得到,通过文件描述符操作某个文件
-buf: 需要往磁盘写入的数据,数组地址(传出参数)
-count: 要写的数据的实际大小
返回值:
-成功:返回实际的写入的字节数
-失败:-1,并设置error


#include <unistd.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
  //1、通过open打开english.txt文件
     int srcfd = open("english.txt",O_RDONLY);
     if(srcfd == -1)
     {
         perror("open");
         return -1;

     }
  //2、创建一个新的文件
    int destfd =open("cpy.txt",O_WRONLY | O_CREAT,0664);
    if(srcfd == -1)
     {
         perror("open");
         return -1;

     }
  //3、频繁的读写操作
    char buf[1024] ={0};
    int len=read(srcfd,buf,sizeof(buf));
    while( (len=read(srcfd,buf,sizeof(buf)))>0)
    {
        write(destfd,buf,len);
    }
  //4、关闭文件 
  close(destfd);
  close(srcfd);
  return 0; 
}

7、 lseek函数

标准C库函数
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
Linux系统函数
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
参数:
—fd :文件描述符,通过Open得到,通过fd操作某个文件
-offset 偏移量
-whence:
SEEK_SET
设置文件指针的偏移量
SEEK_CUR
设置偏移量:从当前位置+第二个参数offset的值
SEEK_END
设置偏移量:文件大小+第二个参数offset的值
返回值:返回当前文件的位置
作用:
1、移动文件指针到头文件
lseek(fd, 0, SEEK_SET) ;
2、获取当前文件指针的位置
lseek(fd, 0, SEEK_CUR) ;
3、获取文件长度
lseek(fd, 0, SEEK_END ) ;
4、拓展文件长度,10b,110b,增加了100个字节
lseek(fd ,100,SEEK_END)

#include <sys/stat.h>
#include <sys/types.h>
#include<fcntl.h>
#include <unistd.h>
#include<stdio.h>
int main()
{
    int fd=open("hellow.txt",O_RDWR);
    if(fd == -1)
     {
         perror("open");
         return -1;

     }
     //拓展文件的长度
    int red= lseek(fd,100,SEEK_END);
      if(red == -1)
      {
         perror("lseek");
         return -1;

     }
      //写入空数据
      write(fd, " ",1);
     //关闭文件
      close(fd);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值