1、系统调用函数
首先,需要包含一堆头文件,这些头文件靠记忆很难记住,所以我们需要在终端调用一个叫 man() 的函数,它包含了该函数的用法,包括了它的头文件,可以直接复制过来使用。当然,函数的调用格式也是可以利用的。接下来,就是利用 open()、read()、write() 这三个函数实现一次文件的复制了:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define SIZE 1024
int main()
{
// 打开要读的文件
int fd1 = open("1.ppt", O_RDONLY);
if (fd1 == -1)
{
perror ("open fd1");
return -1;
}
int fd2 = open("2.ppt", O_WRONLY|O_CREAT, 0777);
if (fd2 == -1)
{
perror ("open fd2");
return -1;
}
int ret = 0;
char buf[SIZE] = {0};
while (ret = read (fd1, buf, SIZE))
{
if (ret == -1)
{
perror("read");
break;
}
write (fd2, buf, ret);
}
printf ("文件复制完成\n");
close (fd1);
close (fd2);
return 0;
}
在权限分配方面,我们给予了最高权限777,但是在一些情况下,我们会发现赋权限之后权限并没有满。这是为什么呢:
我们可以看到open函数的系统手册里有这样一段话,大体意思就是权限赋给之后,系统会帮你执行 (mode & ~umask)这样的一个操作,这个umask是多少呢:
可以看到,在调用 umask 这个函数之后,会显示它的值为 0022(linux Redhat)。
2、标准i/0:
这边的头文件就不需要那么麻烦,因为都包含在 <stdio.h> 这个头文件中。我们需要做的就是调用其中的 fopen、fread、fwrite 函数:
#include <stdio.h>
#define SIZE 1024
int main()
{
// FILE *fp = fopen("abc", "rb+");
FILE *fp = fopen("1.ppt", "ab+");
if (fp == NULL)
{
perror ("fopen");
return -1;
}
FILE *fp1 = fopen("2.ppt", "ab+");
if (fp1 == NULL)
{
perror ("fopen");
return -1;
}
char buf[SIZE] = {0};
// feof 判断是否读到文件结尾,如果读到文件结尾,它返回一个非0 的值
int ret;
while (ret = fread(buf, sizeof(char), SIZE, fp))
{
fwrite(buf, sizeof(char), ret, fp1);
}
if(ret == 0 && !feof(fp))
{
perror ("fread");
return -1;
}
printf ("文件读取结束\n");
fclose(fp);
fclose(fp1);
return 0;
}