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; }