新手上路系列7:系统调用函数与标准i/o实现文件的复制

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值