IO-day3

本文展示了Linux下对文件描述符的基本操作,包括获取_stdin_,_stdout_,_stderr_的描述符,使用_open_函数创建和打开文件,处理O_EXCL标志防止文件重复创建,使用write和read进行数据读写,利用lseek改变文件指针位置,以及如何通过dup和dup2复制文件描述符并共享光标。还探讨了stat函数用于获取文件信息如inode和文件类型。
摘要由CSDN通过智能技术生成

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值