linux系统编程——文件描述符、open、read、write、lseek、stat、属性操作、目录操作、dup、dup2、fcntl

文件描述符

PCB进程控制块可以说是一个复杂的结构体

文件描述符表就是一个数组

在linux系统中,进程是通过文件描述符(file descriptors 简称fd)来访问文件的,文件描述符实际上是一个整数。

一个应用程序,打开一个文件a打开一个文件b等等,你需要一个数组来存储这些文件描述符。每打开一个新文件,则占用一个文件描述符,而且是空闲的最小的一个文件描述符;

大小默认1024;

表中前三个默认是被使用的,:0(标准输入)、1(标准输出)、2(标准错误);默认是打开状态,对应文件是当前终端。

不是说文件描述符表里都是指向文件吗,在linux中一切皆文件,这些也是指向设备文件。

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 <stdio.h>
void perror(const char *s);作用:打印errno对应的错误描述
        s参数:用户描述,比如hello,最终输出的内容是hello:xxx(实际的错误描述)
        

// 创建一个新的文件
int open(const char *pathname, int flags, mode_t mode);
	参数:
        - pathname:要创建的文件的路径
        - flags:对文件的操作权限和其他的设置
        	- 必选项:O_RDONLY, O_WRONLY, O_RDWR  这三个互斥
        	- 可选项:O_CREAY 文件不存在,创建新文件
       	- mode:八进制的数,表示创建出的新的文件的操作权限,比如:0775
        最终的权限是:mode & ~umask
        0777

read、write

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
	参数:
		-fd: 文件描述符,open得到的,通过这个文件描述符操作某个文件
		-buf: 需要读取数据存放的地方,数组的地址(传出参数)
		-count: 指定的数组的大小
	返回值:
		-成功:
			>0: 返回实际的读取到的字节数
			=0:文件已经读取完了
		-失败: -1,并且设置errno

#include <unistd.h>

ssize_t write(int fd,const void *buf, size_t count);
	参数:
		-fd: 文件描述符,open得到的,通过这个文件描述符操作某个文件
		-buf: 要往磁盘写入的数据,数据
		-count: 要写的数据的实际的大小
	返回值:
		成功: 实际写入的字节数
		失败: 返回-1,并设置errno

lseek

标准c库的函数
# include <stdio.h>
int fessk(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);

stat

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

int stat(const char *pathname, struct stat *statbuf);
	作用:获取一个文件相关的一些信息
     参数:
        - pathname:操作的文件的路径
        - statbuf: 结构体变量,传出参数,用于保存获取到的文件的信息
    返回值:
        成功:返回0
        失败:返回-1 设置errno
        
int lstat(const char *pathname, struct stat *statbuf);
	参数:
        - pathname:操作的文件的路径
        -statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
    返回值:
        成功:返回0
        失败:返回-1 设置errno

属性操作

int access(const char *pathname, int mode); // 判断文件权限及文件是否存在
int chmod(const char *filename, int mode); // 修改文件权限
int chown(const char *path, uid_t owner, gid_t group); // 修改文件所有者
int truncate(const char *path, off_t length); // 缩减或者扩展文件的大小

int access(const char *pathname, int mode);
	作用:判断某个文件是否有某个权限,或者文件是否存在
    参数:
        -pathname:判断的文件路径
       	-mode:
        	R_OK:判断是否有读权限
            W_OK:判断是否有写权限
            X_OK:判断是否有执行权限
            F_OK:判断文件是否存在
    返回值:成功返回0,失败返回-1
                
int chmod(const char *filename, int mode); 
	作用:修改文件权限
    参数:
        -pathname:需要修改的文件的路径
        -mode:需要修改的权限值,八进制的数
    返回值:成功返回0,失败返回-1;

目录操作

int mkdir(const char *pathname, mode_t mode);		// 创建一个目录
int rmdir(const char *pathname);					// 删除一个空文件
int rename(const char *oldpath, const char *newpath);// 对目录进行重命名
int chdir(const char *path);						// 更改当前目录
char *getcwd(char *buf,size_t size);				// 获取当前路径
// 目录遍历函数
DIR *opendir(const char *name);						// 打开一个目录
struct dirent *readdir(DIR *dirp);					// 读取目录,读取目录里面的内容
int closedir(DIR *dirp);						    // 关闭一个目录

dup、dup2

int dup(int oldfd);
// 复制文件描述符
int dup2(int oldfd,int newfd);
// 重定向文件描述符

fcntl

int dup(int oldfd);
// 复制文件描述符
int dup2(int oldfd,int newfd);
// 重定向文件描述符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值