int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
open函数一般有两个参数和三个参数的形式,两个参数形式第一个参数为文件路径,第二个参数为打开方式(宏定义),如果有O_CREAT参数,需要有第三个参数指定文件权限。由宏定义的方式给出 COPYMODE,返回值为文件描述符
int creat(const char *pathname, mode_t mode);
create函数有两个参数,第一个参数是文件路径,第二个参数是文件权限,返回
ssize_t read(int fd, void *buf, size_t count);
read函数有三个参数,第一个参数是文件描述符,第二个数读到的内存首地址(字符串指针),第三个参数是读入的最大文件大小
返回值是读到文件的大小
ssize_t write(int fd, const void *buf, size_t count);
write函数有三个参数,第一个参数是文件描述符,第二参数是写入内存首地址(字符串指针),第三个参数是写入最大字节数,返回值是写入生成文件的字节数
close函数比较简单,直接跟文件描述符即可。
off_t lseek(int fd, off_t offset, int whence)是定位文件指针位置函数,第一个参数是文件描述符,第二个参数是文件偏移量,第三个参数是文件定位的位置,有三个宏定义参数,分别是SEEK_SET为文件开头offset处,SEEK_CUR为当前位置加offset,offset可以取正值或负值,SEEK_END为文件末尾加offset,返回值为文件偏移量,出错返回-1
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFFERSIZE 4096
#define COPYMODE 0644
void oops(char *, char *);
int main(int argc, char *argv[])
{
int in_fd, out_fd, n_chars;
char buf[BUFFERSIZE];
if(argc!=3)
{
// 命令行参数个数错误判断
fprintf(stderr, "usage: %s source destination\n",*argv);
exit(1);
}
if((in_fd = open(argv[1], O_RDONLY)) == -1)
oops("Cannot open ", argv[1]); // 打开源文件
if((out_fd = creat(argv[2], COPYMODE)) == -1)
oops("Cannot creat", argv[2]); // 创建生成文件
while((n_chars = read(in_fd, buf, BUFFERSIZE))>0) // 读取源文件
{
if( write(out_fd, buf, n_chars)!=n_chars) // 写入生成文件
oops("Write errot to ",argv[2]);
}
if (n_chars == -1)
oops("Read error from ",argv[1]);
if (close(in_fd == -1 || close(out_fd) == -1)) // 关闭文件
oops("Error closing files","");
return 0;
}
void oops(char *s1, char *s2)
{
fprintf(stderr,"Error: %s ",s1);
perror(s2);
exit(1);
}
另一种写法传入文件描述符的拷贝函数io.c 函数声明在io.h
#include "io.h"
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
# define BUFFER_LEN 4096
void copy(int fdin, int fdout)
{
char buffer[BUFFER_LEN];
ssize_t size;
while(size = read(fdin, buffer, BUFFER_LEN))
{
printf("read size: %ld\n", size);
printf("current: %ld\n", lseek(fdin, 0L, SEEK_CUR));
if(write(fdout, buffer, size)!=size)
{
fprintf(stderr, "write error:%s \n", strerror(errno));
exit(1);
}
}
if(size<0)
{
fprintf(stderr, "read error: %s\n", strerror(errno));
exit(1);
}
}
cp.c
#include "io.h"
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc != 3)
{
fprintf(stderr, "usage: %s srcfile destfile\n",argv[0]);
exit(1);
}
int fdin, fdout;
fdin = open(argv[1], O_RDONLY);
printf("file length: %ld\n",
lseek(fdin, 0L, SEEK_END));
lseek(fdin,0L,SEEK_SET);
if(fdin < 0)
{
fprintf(stderr,"open error: %s\n", strerror(errno));
exit(1);
}
else
{
printf("open file: %d\n", fdin);
}
fdout = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0777);
if(fdout < 0)
{
fprintf(stderr, "open error: %s\n",strerror(errno));
exit(1);
}
else
{
printf("open file: %d\n",fdout);
}
copy(fdin,fdout);
close(fdin);
close(fdout);
return 0;
}