自己动手写cp命令

   好久没写东西了     开始整理自己写的一些东西    东西不多   写得也很菜   学校风气不怎么样    

  真正学习的没几个    最近老在玩游戏    控制不住自己     四级还没过  觉得压力很大    不是自己

不想学  只是环境不怎么好   宿舍都在看电影打游戏   学不下  没项目  没实力   没学习路线  

嵌入式真的很难   以前觉得应该没那么难   现在觉得好傻  

 不多说   贴个 上个学期的实训的东西  虽然很多不懂   但只为记录一下  

老师是个漂亮的刚出去工作的学姐      

#include <stdio.h>
#include <unistd.h>               //close
#include <fcntl.h>                //open
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <stdlib.h>
//#include <conio.h>

#define LEN 1024*512
#define len 1024

#ifndef __USE_FILE_OFFSET64
#define __USE_FILE_OFFSET64
//
#endif
//
#define __USE_LARGEFILE64
#ifndef __USE_LARGEFILE64
#endif

#ifndef __USE_LARGEFILE64_SOURCE
#define __USE_LARGEFILE64_SOURCE
#endif

int main(int argc, char *agve[]) {

	char *dest, *src;/*  目标文件名  源文件名 */
	size_t dest_fd, src_fd;
	char *mp;
	struct stat st;
	int pro;
	size_t size;
	int ret, len1 = 0;
	int mmap_len = 0, cur_size = 0;
	int sum;

	if (argc != 3) {
		perror("error: ./cp.c src dest");
		return -1;
	}

	src = agve[1];
	dest = agve[2];

	/* 以只读方式打开源文件 */
	src_fd = open64(src, O_RDONLY);
	if (src_fd < 0) {
		perror("src open64() error");
		return -1;
	}

	if (-1 == fstat64(src_fd, &st)) {
		perror("fstat() error");
		return -1;
	}
	size = st.st_size;
/* 以只写方式打开目标文件,若此文件不存在则创建, 访问权限值为644 */
	dest_fd = open64(dest, O_RDWR | O_CREAT, 00664);
	if (dest_fd < 0) {
		perror("dest open64() error");
		return -1;
	}

	printf("filesize = %d\n", size);

	int cur_mmap = 0;
	int j, i = 0;

	while (1) {
		if (size - cur_mmap < LEN)
			mmap_len = size - cur_mmap;
		else
			mmap_len = LEN;

		mp = (char *) mmap(NULL, mmap_len, PROT_READ, MAP_SHARED, src_fd,
				cur_mmap);

//		if(mp == NULL)
		if (mp == MAP_FAILED) //if(mp == (void *) -1)
		{
			perror("mmap error\n");
			return -1;
		}

		cur_size = 0;
		while (1) {
			if (mmap_len - cur_size < len)
				len1 = mmap_len - cur_size;
			else
				len1 = len;

			ret = write(dest_fd, mp + cur_size, len1);
			sum = cur_mmap + cur_size + ret;
			pro = (float) (sum) / size * 100;

			for (; i <= 50; i++) {
				if (i == 49)
					printf("=\r");
				else
					printf("=");
			}

			for (j = 0; j < pro; j += 2) {
				printf(">");
			}
			printf("%d%%\r", pro);

			cur_size += len1;
			if (cur_size == mmap_len)
				break;
		}

		munmap(mp, mmap_len);

		cur_mmap += mmap_len;
		if (cur_mmap == size)
			break;
	}

	close(dest_fd);
	close(src_fd);

	printf("\n");
	return 0;

}

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值