linux C-文件API介绍与使用
Posted 西邮菜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux C-文件API介绍与使用相关的知识,希望对你有一定的参考价值。
首先记录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");
以上是关于linux C-文件API介绍与使用的主要内容,如果未能解决你的问题,请参考以下文章