zl程序教程

您现在的位置是:首页 >  系统

当前栏目

linux C-文件API介绍与使用

Linux文件API 介绍 使用
2023-09-11 14:16:29 时间

首先记录API,常用的有open、write、read、dup,close等。

一、 open

调用成功后返回一个fd,通过这个fd文件描述符可以操控一个文件。

int open(constchar*pathname,intflags);
int open(constchar*pathname,intflags,mode_t mode);
pathname:打开文件的路径名
flags:用来控制打开文件的模式
mode:用来设置创建文件的权限(rwx)。当flags中带有O_CREAT时才有效。

其中flags参数很重要, 下面列出了其参数的使用方式:

O_RDONLY:只读模式 O_WRONLY:只写模式 O_RDWR:可读可写模式,必须设置其中一个。
O_APPEND:以后每次写文件时都会先将当前文件偏移量设置到文件末尾,但是读文件时时不影响的
O_CREAT:如果文件不存在则创建,需要使用mode选项。来指明新文件的访问权限
O_EXCL:要打开的文件如果存在则出错,必须要和O_CREAT参数一起使用 O_TRUNC:打开文件的同时将文件中的内容清除
O_NOCTTY:如果打开的文件是终端设备,则不将此设备设置为进程的控制终端
O_NONBLOCK:如果打开的文件是一个管道、一个块设备文件或一个字符设备文件,则后续的I/O操作均设置为非阻塞方式
O_SYNC:使每次write都等到物理I/O操作完成,包括由该write操作引起的文件属性更新所需的I/O。

二、close

通过文件描述符fd来关闭一个打开的文件,文件打开结束后必须关闭,养成好习惯,如果文件打开失败要退出时,也要关闭前面打开成功的文件

int close(int fd)
fd:是需要关闭的文件描述符

三、read 

从一个文件中读出固定字节数,并将读出的数据保存在buf指向的内存中(实际就是个数组)。

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

传送count个字节到buf指针所指的内存中
使用时多定义char *buf[MAX];
函数返回值为实际读取到的字节数。

四、write

将数据写入fd对应的文件中,并返回实际写入的字节数。

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

write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。
执行成功的话会返回写入的字节数。

五、dup

文件描述符复制函数,会复制指定的文件描述符,返回值为当前可用文件描述符中最小可用值。最后两个文件描述符实际指向一个文件。

int dup(int oldfd);//oldfd是需要复制的文件描述符
int dup2(int oldfd, int newfd);
dup2可以指定返回的文件描述符,用法都一样。

六、实现文件拷贝

这是我自己写的慢拷贝,加了信号功能,可以看到txt文件已经拷贝了text文件的内容。

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFMAX 32
int loop=0;
void handler()
{
	alarm(1);
	loop=1;
}
int main(int argc,char **argv)
{
	if(argc<2)
	{
		perror("少于2个文件!\n");
		exit(1);
	}
	signal(SIGALRM,handler);
	alarm(1);
	int fd0,fd1;
	if((fd0=open(argv[1],O_RDONLY))<0)
	{
		perror("open error\n");
		exit(1);
	}
	if((fd1=open(argv[2],O_WRONLY))<0)
	{
		perror("open error\n");
		exit(1);
	}
	int len;
	char buf[BUFFMAX];
	while(1)
	{
		while(!loop)
			pause();
		loop=0;
		len=read(fd0,buf,BUFFMAX);
		if(len>0)
		{
			write(fd1,buf,len);
		}
		if(len==0)
			break;
	}
	close(fd0);
	exit(0);
} 

 七、文件描述符复制功能

从fd1中读,实际就是从fd中读因为fd1=dup(fd);他两指向同一个文件,看看是否可以,我们把dup.c文件读到txt文件中。

可以看后面的图,没有任何问题。 

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define BUF 32
int main(int argc,char** argv)
{
	int fd,fd1,fd2;
	fd=open(argv[1],O_RDONLY);	
	fd2=open(argv[2],O_WRONLY);
	fd1=dup(fd);
	char buf[BUF];
	int len;
	while(1)
	{
		len=read(fd1,buf,BUF);
		if(len!=0)
		{
			write(fd2,buf,len);
		}
		else break;
	}
	close(fd);
	close(fd1);
	close(fd2);
	printf("over\n");
}