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】linux常用基本命令
- linux下实现目录即文件的完整删除
- linux环境中,如何将一个大文件拆分成多个小文件?
- Linux系统下如何运行.sh文件
- linux 切换root账号_LINUX 创建用户及切换用户
- 安利一款Python开发的仿Linux树形显示目录tree命令
- linux中有选择的删除目录中的文件
- 使用 smem 可视化显示Linux内存使用情况
- 剪切板是一个安全问题 - 在 Linux 中你可以用 xclip 和 cron 修复它
- Linux有问必答:如何通过命令行创建和设置一个MySQL用户
- linux shadow文件*,Linux /etc/shadow文件详解
- 在linux服务器上配置基于ssh的免密码登入
- MySQL 调优基础(三) Linux文件系统
- 《树莓派渗透测试实战》——2.6 设置Kali Linux使用的3G USB上网卡
- LINUX文件权限
- 利用lsof去查看Unix/Linux进程打开了哪些文件
- linux一切皆文件之文件描述符
- Linux文件锁flock
- Linux基础:文件基础属性及如何更改文件属性、文件与目录管理、linux软硬链接的理解、linux用户和用户组管理
- 【八天学好Linux】第三天 Linux的文件显示与命令处理
- Linux学习笔记(7)CRT实现windows与linux的文件上传下载
- Linux调整日期时间
- 【Linux】linux中删除指定日期之前的文件
- linux中/etc/passwd文件与/etc/shadow文件解析
- 学习SDN的新途径 Linux基金会网上开课
- 很全的linux网络编程技巧