1. open(const char *pathname,int flags):
open(const char *pathname,int flags,mode_t mode):
功能:打开文件
参数: pathname:文件的路径和名字
flags:打开的方式
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:读写
O_CREAT:创建,一定要填写第三个参数 mode权限 0664
O_EXCL:一般跟O_CREAT连用,如果文件存在返回EEXIST
O_TRUNC:清空
O_APPEND:追加
mode:权限0664 mode &(~umask)(umask一般默认0002(八进制))
返回值:成功返回文件描述符,失败返回-1置位错误码
2.close(int fd):
功能:关闭文件
参数: fd:文件描述符
返回值:成功返回0,失败返回-1置位错误码
3.read(int fd,void *buf,size_t count):
功能:从文件中读数据到buf中
参数: fd:文件描述符
buf: 存数据的首地址
count:大小(字节)
返回值:成功返回读取字符的个数,如果返回的个数小于count不代表错误,如果读取到了0代表EOF,失败返回-1,置位错误码
4.write(int fd,const void *buf,size_t count):
功能:从buf中写数据到文件中
参数: fd:文件描述符
buf: 取数据的首地址
count:大小(字节)
返回值:成功返回写入字符的个数,如果返回的个数小于count不代表错误表示写满了,失败返回-1,置位错误码
例:实现拷贝功能
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char const *argv[])
{
if(argc!=3){
fprintf(stderr,"intput error,try again\n");
fprintf(stderr,"usage: ./a.out srcfile destfile\n");
return -1;
}
int sfd,dfd;
int ret=0;
char buf[1024]={0};
if((sfd=open(argv[1],O_RDONLY))==-1){
perror("open srcfile error");
return -1;
}
if((dfd=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664))==-1){
perror("open destfile error");
return -1;
}
while((ret=read(sfd,buf,sizeof(buf)))!=0){//0表示读到结尾
write(dfd,buf,ret);
}
close(sfd);
close(dfd);
return 0;
}
5.lseek(int fd,off_t offset,int whence):
功能:设置光标的位置
参数: fd:文件描述符
offset: 偏移
>0:向后偏移
=0:不偏移
<0:前偏移
whence:
SEEK_SET:开头
SEEK_CUR:当前位置
SEEK_END:结尾
返回值:成功返回光标到开头字符的个数(lseek=fseek+ftell),失败返回-1置位错误码
6.stat(const char *pathname,struct stat *statbuf):
功能:获取文件的属性信息
参数: pathname:文件的路径及名字
statbuf:获取到的状态信息
返回值:成功返回0,失败返回-1并置位错误码
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
if(argc!=2){
fprintf(stderr,"intput error,try again\n");
fprintf(stderr,"usage:./a.out filename\n");
return -1;
}
struct stat st;
if(stat(argv[1],&st)){
perror("get file stat error");
return -1;
}
if((st.st_mode &0170000)==0100000){
printf("这是一个普通文件\n");
}else if((st.st_mode &0170000)==0040000){
printf("这是一个目录文件\n");
}else if((st.st_mode &0170000)==0020000){
printf("这是一个字符设备文件\n");
}else if((st.st_mode &0170000)==0060000){
printf("这是一个块设备文件\n");
}else if((st.st_mode &0170000)==0010000){
printf("这是一个管道文件\n");
}else if((st.st_mode &0170000)==0120000){
printf("这是一个链接文件\n");
}else if((st.st_mode &0170000)==0140000){
printf("这是一个套接字文件\n");
}
printf("inode_num=%ld\n",st.st_ino);//打印文件的inode号,类似于身份证是唯一的
return 0;
}
7.dup(int oldfd):
功能:拷贝文件描述符,拷贝的文件描述符和旧的文件描述符共用offset(光标),但是不共用flags
参数: oldfd:旧的文件描述符
返回值:成功返回新的文件描述符,失败返回-1,置位错误码
8.dup2(int oldfd,int newfd): 服务器会经常用到这个函数
功能:将oldfd拷贝newfd,如果newfd已经有对应的打开的文件,将这个文件关闭,然后将旧的文件描述符拷贝成新的文件描述符
参数: oldfd:旧的文件描述符
newfd:新的文件描述符
返回值:成功返回新的文件描述符,失败返回-1,置位错误码
dup2(fd,0); //将标准输入写到文件中
dup2(fd,1); //将标准输出写到文件中
dup2(fd,2); //将标准出错写到文件中