系统编程--文件函数
2020-08-06 本文已影响0人
魔芋辣椒
一、open
#include<unistd.h>
#include<fcntl.h>
int open(char *path,int flags)
int open(char *path,int flags,mode_t mode) //创建文件时使用,mode为0777等权限值
- 常用flag
O_RDONLY | O_WRONLY|O_RDWR
O_CREAT | O_APPEND|O_EXCL|O_NOBLOCK|O_TRUNC
创建文件 追加 是否存在 是否阻塞 文件清空
-
常见错误
引入
#include errno.h
#include string.h
后即可用以下变量和函数查看打开错误
printf(errno);
strerror(errno);
二、read
ssize_t read(int fd,void *buf,size_t count)
返回读取的数量,若读完返回0,错误返回-1
实例
char buff[1024];
int fd1=open(argv[1],O_RDONLY);
int fd2=open(argv[1],O_RDWR |O_CREAT | O_TRUNC,0644);
while((n=read(fd,buff,1024))!=0){
write(fd,buff,n);
}
三、write
ssize_t read(int fd,const void *buf,size_t count)
四、perror
#include <stdio.h>
void perror(const char *s);
五、exit
#include<stdlib.h>
void exit(int x);
六、fcntl
读取文件的状态位图
F_GETFL \\返回位图
F_SETFL \\返回是否成功
int flgs=fcntl(fd,F_GETFL)
int flgs=fcntl(STDIN_FILENO,F_GETFL);
flgs |=O_NONBLOCK;
int ret=fcntl(STDIN_FILENO,F_SETFL,flgs); \\给0号文件设置非阻塞状态
七、lseek
//原型 返回类型为矢量偏移值
//whence 可取SEEK_SET SEEK_CUR SEEK_END
off_t lseek=(int fd,off_t offset,int whence);
//获取文件大小
int length=lseek(fd,0,SEEK_END);
//拓展文件大小
lseek(fd,111,SEEK_END);
write(fd,'\0',1); //不写入则会导致文件大小不变
八、stat
查看文件属性
////statbuf 为传出指针,传入后执行完,给statbuf赋值
#include<sys/stat.h>
int stat(const char *pathname, struct stat *statbuf);
struct stat buff;
stat(" ".&buff);
/*
struct stat {
dev_t st_dev; / ID of device containing file
ino_t st_ino; /Inode number
mode_t st_mode; /File type and mode
nlink_t st_nlink; / Number of hard links
uid_t st_uid; /User ID of owner
gid_t st_gid; /Group ID of owner
dev_t st_rdev; /Device ID (if special file)
off_t st_size; / Total size, in bytes
blksize_t st_blksize; /Block size for filesystem I/O
blkcnt_t st_blocks; / Number of 512B blocks allocated
}
*/
九、execlp
execlp("命令,如ls","同一如ls不可省略","参数,如-l",NULL);
//NULL为哨兵,不可省略
执行到此后,后面的代码均失效,不执行
十、dup2
/重定向,将新的文件描述符指向旧的文件
dup2(int oldfileno,int newfileno);
//如不想从标准输入读取,想从文件读取
dup2(oldfno,STDIN_FILENO);
十、ftruncate
int ftruncate(int fd, off_t length);
//拓展文件大小
十、unlink
int unlink(char* filename);
//删除文件,若文件还在被使用,则先取消链接,等待其使用完后删除