文件相关系统调用接口
int open (const char* pathname,int flags,mode_t mode)
pathname:文件路径名
flags: 选项标志 ,也可以理解为打开方式,主要有以下6种定义,下面三种必选一
(1)只读 O_RDONLY (2)只写 O_WRONLY (3)可读可写 O_RDWR
以下三种打开方式: 可选项可不选
(1) O_CREAT 文件不存在则创建,存在则打开 ;不可与 O_EXCL 同用
(2) O_TRUNC 打开文件的时候清空原有内容
(3) O_APPEND 写追加模式(总是追加在末尾)
mode :创建文件时给定权限 (八进制数字)
计算方法 (1)mode & (~umask) (2)用最大权限减去 umask 的值
说到 umask(),就得稍微哆嗦两句,毕竟也是一个知识点,它是干嘛用的,诶~
它,,是用来控制文件或目录的默认权限,推介用第一种方法计算文件权限;一般情况下文件最大权限是666,目录最大权限是777;点击>>umask具体的描述
该系统接口的返回值是:文件描述符(正整数) ;出错返回 -1
int fd = open("./text2.txt",O_RDWR | O_CREAT |O_APPEND ,0777);
if(fd<0){
perror("open error");
return -1;
}
ssize_t write (int fd , const void *buf,size_t count)
fd 打开文件返回的文件描述符,类型是 int 型
buf 要向文件写入数据
count 要写入的数据长度
返回值 实际写入的字节数 ;错误返回 -1
char buf[1024]="Are you ok !!";
int ret = write(fd,buf,strlen(buf));
if(ret < 0 ){
perror("write error");
return -1;
}
printf("写入数据的长度:%d\n",ret);
ssize_t read(int fd , void *buf , size_t count);
fd 打开文件所返回的文件描述符
buf 对读取到的数据进行存储的位置
count 要读取的数据长度
返回值 实际的读取字节数 出错返回 -1
lseek(fd,0,SEEK_SET);
//在读数据之前要加这条语句,否则读不到数据·
memset(buf,0x00,1024);
ret = read(fd,buf,1023);
if(ret < 0){
perror("read error");
return -1;
}else if(ret == 0){
printf("no date\n");
}else{
printf("读到%d个字节\n",ret);
printf("read buf : [%s]\n",buf);
}
off_t lseek(int fd , off_t offset , int whence);
fd 打开文件所返回的文件描述符
offset 偏移量
whence 偏移位置
SEEK_SET
SEEK_CUR
SEEK_END
返回值 返回当前位置到文件起始位置的偏移量
lseek(fd,0,SEEK_SET);
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(){
umask(0);
//设置调用进程的文件创建权限掩码,
int fd = open("./text2.txt",O_RDWR | O_CREAT |O_APPEND ,0777);
if(fd<0){
perror("open error");
return -1;
}
char buf[1024]="Are you ok !!";
int ret = write(fd,buf,strlen(buf));
if(ret < 0 ){
perror("write error");
return -1;
}
printf("写入数据的长度:%d\n",ret);
lseek(fd,0,SEEK_SET);
//在读数据之前要加这条语句,否则读不到数据·
memset(buf,0x00,1024);
ret = read(fd,buf,1023);
if(ret < 0){
perror("read error");
return -1;
}else if(ret ==0){
printf("no date\n");
}else{
printf("读到%d个字节\n",ret);
printf("read buf : [%s]\n",buf);
}
close(fd);
return 0;
}
文件描述符
文件描述符就是一个整数,Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2;
文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数
组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件
文件描述符详细介绍
https://blog.youkuaiyun.com/captain_mxd/article/details/52153233
https://www.cnblogs.com/ginvip/p/6350222.html
https://www.cnblogs.com/alan666/p/8311890.html
重定向 《=点它
https://www.cnblogs.com/linuxAndMcu/p/7668138.html
https://blog.51cto.com/keren/170892
https://www.cnblogs.com/GODYCA/archive/2013/01/05/2846197.html