1.文件描述符
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
//文件描述符:_fileno
printf("stdin的文件描述符:%d\n",stdin->_fileno);
printf("stdout的文件描述符:%d\n",stdout->_fileno);
printf("stderr的文件描述符:%d\n",stderr->_fileno);
return 0;
}
2.open
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd;
//更改权限掩码的值;
umask(0);
if((fd=open("./bb.txt",O_WRONLY|O_CREAT,0666))==-1){
perror("open error");
return -1;
}
return 0;
}
3. excl.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd;
//打开文件
//O_EXCL:若文件存在则报错,并将错误码errno置位,改为EEXIST
if((fd=open("./bb.txt",O_RDWR|O_CREAT|O_EXCL,0664))==-1){
//判断错误原因:
//1.O_EXCL引起的,判断文件存在了
if(errno==EEXIST){
printf("文件以存在,无需重复创建\n");
return -1;
}else{
perror("open fail");
return -1;
}
}
//关闭文件
if(close(fd)==-1){
printf("关闭失败\n");
}else{
printf("关闭成功\n");
}
return 0;
}
4.write和read函数
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd;
if((fd=open("./bb.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){
perror("open error");
return -1;
}
//输出文件描述符
printf("fd=%d\n",fd);
//定义容器存放数据
char buf[128]="hello world";
//将数据写入文件
write(fd,buf,sizeof(buf));
//close
close(fd);
//重新以只读的方式打开文件
if((fd=open("./bb.txt",O_RDONLY))==-1){
perror("open error");
return -1;
}
char buf1[10];
int ret=read(fd,buf1,sizeof(buf1));//冲文件中读取10字节的数据
printf("buf1=%s\n",buf1);
//输出
write(1,buf,ret);
close(fd);
return 0;
}
5.lseek
#include <myhead.h>
int main(int argc, const char *argv[])
{
int fd;
if((fd=open("./02open.c",O_RDONLY))==-1){
return -1;
}
printf("文件大小为:%ld\n",lseek(fd,0,SEEK_END));
close(fd);
return 0;
}
6.copy.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
int fd1;
if((fd1=open("./08test.txt",O_RDWR|O_CREAT|O_TRUNC,0664))==-1){
perror("open error");
return -1;
}
printf("fd1=%d\n",fd1);
int fd2=fd1;
printf("fd2=%d\n",fd2);
write(fd1,"hello world",strlen("hello world"));
char buf[128]="";
read(fd2,buf,sizeof(buf));
write(1,buf,sizeof(buf));
close(fd1);
return 0;
}
7.dup函数
#include <myhead.h>
int main(int argc, const char *argv[])
{
int fd1,fd2;
if((fd1=open("./bb.txt",O_RDONLY))==-1){
perror("open error");
return -1;
}
printf("fd1=%d\n",fd1);
//调用文件描述符拷贝函数
fd2=dup(fd1);
printf("fd2=%d\n",fd2);
//通过fd1将光标移动到第6个字节数
lseek(fd1,6,SEEK_SET);
//使用fd2读取数据,判断fd2光标是否也被移动
char buf[10];
int ret=read(fd2,buf,sizeof(buf));
write(1,buf,ret);
printf("\n");
close(fd1);
close(fd2);
return 0;
}
8.dup2
#include <myhead.h>
int main(int argc, const char *argv[])
{
int fd1,fd2;
if((fd1=open("./bb.txt",O_RDONLY))==-1){
return -1;
}
if((fd2=open("./bb.txt",O_RDWR))==-1){
return -1;
}
printf("fd1=%d\n",fd1); //3
printf("fd2=%d\n",fd2); //4
dup2(fd2,fd1); //操作结束后,fd1和fd2都指向fd2原本指向的文件
printf("fd1=%d\n",fd1); //3
printf("fd2=%d\n",fd2); //4
//将fd1偏移6个字节
lseek(fd1,6,SEEK_SET);
//再读取fd2,结果发现用dup2拷贝的描述符共享光标
/*
char buf[10];
read(fd2,buf,sizeof(buf));
write(1,buf,sizeof(buf));
*/
//常用的操作
//将stdout的文件描述符先关闭,并将1号描述符号的功能更改成fd2,
//从此之后,所有对标准输出进行的操作,全部输出到文件中
dup2(fd2,1);
printf("\naaaaaaaaaaaaaaaa\n");
close(fd1);
close(fd2);
return 0;
}
9.stat函数
#include <myhead.h>
int main(int argc, const char *argv[])
{
struct stat sb;
stat("./01标准io描述符.c",&sb);
printf("inode:%ld\n",sb.st_ino);//文件iNode号
printf("type:%#o\n",sb.st_mode&S_IFMT);//文件类型
printf("mode:%#o\n",sb.st_mode&0777);//文件类型
return 0;
}