实现自己的cp命令
1 综述
在Unix和Linux系统里,cp是经常使用的一个命令,用于复制文件,用法如下:
$cp src_file dest_file
以下就使用若干系统调用来实现自己的cp。
2 原理
open:打开一个文件;
close:关闭文件;
read:从文件中读取数据到缓冲区;
write:将数据从缓冲区写入文件;
fcntl:给文件加锁;
sbrk:申请堆内存;
brk:释放堆内存。
以下直接上代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h> int main(int argc, char *argv[])
{
char *buf = NULL;
int fd_src = -1;
int fd_dest = -1;
int buf_size = 4096;
int cnt = 0;
struct flock lock; if (argc < 3) {
printf("usage: %s <src_file> <dest_file> [buf_size]\n", argv[0]);
return 0;
} if ((fd_src=open(argv[1], O_RDONLY)) == -1) {
perror("open src. file");
return 1;
}
if ((fd_dest=open(argv[2], O_WRONLY|O_CREAT|O_EXCL, 0664)) == -1) {
perror("open dest. file");
close(fd_src);
return 2;
}
if (argc == 4) {
buf_size = atoi(argv[3]);
}
buf = sbrk(buf_size);
if ((void*)-1 == buf) {
perror("malloc");
close(fd_src);
close(fd_dest);
return 3;
} lock.l_type = F_RDLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_pid = -1;
if (fcntl(fd_src, F_SETLK, &lock) == -1) {
fprintf(stderr, "%s has been locked by other process\n", argv[1]);
close(fd_src);
close(fd_dest);
return 8;
} errno = 0;
while ((cnt = read(fd_src, buf, buf_size)) > 0) {
if (write(fd_dest, buf, cnt) < cnt) {
perror("write");
close(fd_src);
close(fd_dest);
return 4;
}
}
if (0 != errno) {
perror("read");
}
close(fd_src);
fd_src = -1;
close(fd_dest);
fd_dest = -1;
brk(buf); return 0;
}
3 总结
我的cp除了需要指定源文件和目的文件之外,还可以指定缓冲区的大小,其它就类似系统的cp了,代码很简单,也能实现了文件复制功能。
实现自己的cp命令的更多相关文章
- Linux命令学习总结:cp命令
命令简介: cp命令用来复制文件或目录.指令英文原义:copy 指令所在路径:/bin/cp 命令语法: Usage: cp [OPTION]... [-T] SOURCE DEST or: cp [ ...
- 【初级】linux cp 命令详解及使用方法实战
cp:复制文件或者目录 前言: cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不 ...
- linux命令(8):cp 命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...
- Linux cp命令使用说明
Linux cp命令使用说明 --功能说明:复制目录或文件 --命令格式:cp [参数] <文件或目录> <文件或目录> --常用参数: -R 复制目录 -i 覆盖文件之 ...
- 每天一个linux命令(8):cp 命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...
- Linux 的cp命令
Linux 的cp命令 功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若 ...
- 每天一个 Linux 命令(8):cp 命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是在 ...
- 每天一个linux命令(7):cp 命令
cp 命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在, 就会询问是否覆盖,不管你是否使用-i参数.但是如 ...
- linux cp命令参数及用法详解
cp (复制档案或目录)[root@linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[root@linux ~]# cp [options] ...
- cp 命令(转)
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...
随机推荐
- Bootstrap_Javascript_手风琴
触发手风琴可以通过自定义的 data-toggle 属性来触发.其中data-toggle值设置为 collapse,data-target="#折叠区标识符". 第一步,设计一个 ...
- JQuery解析XML数据的几个例子
用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 第一种方案: <script ty ...
- 如何让同一个字段在不同的view中显示不同的内容
many2one 字段默认显示 对象的name字段, 但也可以定义name_get方法显示不同的内容 如res.partner 对象可以根据 context 内容是否显示 客户的地址,职位,email ...
- action 关联
<act_window context="{'product_id': active_id}" id="act_stock_product_location_ope ...
- Django db relationship
# coding=utf-8 from django.db import models """ Django数据库关系: 一对一关系:OneToOneField 多对多关 ...
- TreeList的VisibleNodesCount,Noes.Count,AllNdoesCount以及焦点节点的删除
初始5个Nodes 隐藏23节点,打印全部节点Tag 显示23,打印全部节点Tag 隐藏全部节点,打印节点Tag TreeList.Nodes.Count == TreeList.AllNodesCo ...
- 关于HTML编辑页面(1)
1,<title>...</title> //省略号表示的是网页标题 2,<body>...</body>//省略号表示的是网页正文内容 3,在Drea ...
- iOS利用响应链机制点击tableview空白处关闭键盘-可以作为参考
http://www.jianshu.com/p/9717b792599c 是原文地址 处理关闭键盘的做法一般分为两种:1.放弃第一响应者身份:2.当前视图结束编辑.通常情况下只要我们在合适的时机 ...
- 开源java
http://code.google.com/p/nullpomino/source/checkout http://www.open-open.com/open254058.htm http://w ...
- hdu 5063 Operation the Sequence
http://acm.hdu.edu.cn/showproblem.php?pid=5063 思路:因为3查询最多50,所以可以在查询的时候逆操作找到原来的位置,然后再求查询的值. #include ...