关于linux 文件描述符 及 open函数 read函数 write函数的应用

linux 文件描述符

FD (file descriptor): 文件描述符,但成功打开一个文件时操作系统会返回一个标识,该描述符是该打开文件的唯一标识。 不同的文件标识符可能代表一个相同文件,一个文件可同时被多个进程打开,同时返回不同的文件标识符,文件标识符类似于一个指针,对文件进行的I/O操作可通过该文件的文件标识符进行操作。

文件标识符0 是指标准输入 STDIN
文件标识符1 是指标准输入 STDOUT
文件标识符2 是指标准错误 STDERR

open函数

头文件

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

函数原型

一般用来打开某个文件
open(const char *pathname, int flags(mode_t mode));

pathname:代表当前路径下的文件名,或文件的绝对路径

flags 代表选中打开状态的异或值

O_RDONLY:只读模式
O_WRONLY:只写模式
O_RDWR:可读可写
上三个状态必须选择且至多选择一个

O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
O_CREAT 表示如果指定文件不存在,则创建这个文件
O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)

返回值

若成功打开文件, 返回一个文件描述符,否则返回-1。

write 函数

头文件

#include <unistd.h>

函数原型

write(int fd, const void *buf, size_t count);

fd:写文件的文件描述符

buf:存放写入数据的首地址

count:写入数据的字节数

返回值

大于等于0 :成功写入的字节数

小于0:写入失败

read函数

头文件

#include <unistd.h>

函数原型

read(int fd, void *buf, size_t count);

类似于write

返回值

大于等于0 :成功读入的字节数

小于0:写入失败

基于上三个函数完成的copy函数实例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

char *buf[64]; //字符缓存区

void copy(int fd_r, int fd_w){
	int n;
	
	while((n = read(fd_r, buf, sizeof(buf))) > 0){
		if(write(fd_w, buf, n) != n){
			printf("WRITE ERROR\n");
			exit(1);
		}
	}
	if(n<0){
		printf("READ ERROR\n");
		exit(1);
	}
}

int main(int argc,char* argv[]){
    int fd_w,fd_r;
	
	if(argc < 3){ 
		printf("error\n");
		exit(1);
	}
	if((fd_r = open(argv[1], O_RDONLY)) < 0){
		printf("OPEN READ FILE ERROR\n");
		exit(1);
	}
	if((fd_r = open(argv[2], O_WRONLY)) < 0){
		printf("OPEN WRITE FILE ERROR\n");
		exit(1);
	}
	
	copy(fd_r, fd_w);
	
	close(fd_r),close(fd_w);
	exit(0);
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值