1,首先需要了解cp的原理。
2,可以参考cp的源码去了解其原理
3,cp命令的源码可以在linux内核中找到。
4,或者下载busybox其中也会有cp的源码
只有了解其原理之后才能谈如何实现。参考代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#define BUF_SIZE 1024
#define PATH_LEN 128
void my_err(char *err_string, int line )
{
fprintf(stderr,"line:%d ",line);
perror(err_string);
exit(1);
}
void copy_data(const int frd,const int fwd)
{
int read_len = 0, write_len = 0;
unsigned char buf[BUF_SIZE], *p_buf;
while ( (read_len = read(frd,buf,BUF_SIZE)) ) {
if (-1 == read_len) {
my_err("Read error", __LINE__);
}
else if (read_len > 0) { //把读取部分写入目标文件
p_buf = buf;
while ( (write_len = write(fwd,p_buf,read_len)) ) {
if(write_len == read_len) {
break;
}
else if (write_len > 0) { //只写入部分
p_buf += write_len;
read_len -= write_len;
}
else if(-1 == write_len) {
my_err("Write error", __LINE__);
}
}
if (-1 == write_len) break;
}
}
}
int main(int argc, char **argv)
{
int frd, fwd; //读写文件描述符
int len = 0;
char *pSrc, *pDes; //分别指向源文件路径和目标文件路径
struct stat src_st,des_st;
if (argc < 3) {
printf("用法 ./MyCp <源文件路径> <目标文件路径>\n");
my_err("arguments error ", __LINE__);
}
frd = open(argv[1],O_RDONLY);
if (frd == -1) {
my_err("Can not opne file", __LINE__);
}
if (fstat(frd,&src_st) == -1) {
my_err("stat error",__LINE__);
}
/*检查源文件路径是否是目录*/
if (S_ISDIR(src_st.st_mode)) {
my_err("略过目录",__LINE__);
}
pDes = argv[2];
stat(argv[2],&des_st);
if (S_ISDIR(des_st.st_mode)) { //目标路径是目录,则使用源文件的文件名
len = strlen(argv[1]);
pSrc = argv[1] + (len-1); //指向最后一个字符
/*先找出源文件的文件名*/
while (pSrc >= argv[1] && *pSrc != '/') {
pSrc--;
}
pSrc++;//指向源文件名
len = strlen(argv[2]);
// . 表示复制到当前工作目录
if (1 == len && '.' == *(argv[2])) {
len = 0; //没有申请空间,后面就不用释放
pDes = pSrc;
}
else { //复制到某目录下,使用源文件名
pDes = (char *)malloc(sizeof(char)*PATH_LEN);
if (NULL == pDes) {
my_err("malloc error ", __LINE__);
}
strcpy(pDes,argv[2]);
if ( *(pDes+(len-1)) != '/' ) { //目录缺少最后的'/',则补上’/‘
strcat(pDes,"/");
}
strcat(pDes+len,pSrc);
}
}
/* 打开目标文件, 使权限与源文件相同*/
fwd = open(pDes,O_WRONLY | O_CREAT | O_TRUNC,src_st.st_mode);
if (fwd == -1) {
my_err("Can not creat file", __LINE__);
}
copy_data(frd,fwd);
//puts("end of copy");
if (len > 0 && pDes != NULL)
free(pDes);
close(frd);
close(fwd);
return 0;
}
用fopen()或者open()打开源文件和目标文件,用fread()或者read()函数读取源文件,用fwrite()或者write()写入目标文件,再用fclose()或者close()关闭文件.
system函数,直接可以用cp这个命令
直接下载一下cp 指令的源码,看看不就行了
孩子去看coreutils的源码 , 里面有cp源码
学院高度重视人才培养质量。牢牢把握“国际儒商”理念精髓,立足外语应用能力,着力夯实专业技能,学生在国家级、省级技能大赛中屡获佳绩。多次获全国创业设计暨沙盘模拟经营大赛高职高专组冠军,全国高职高专院校物流技能竞赛冠军,“CCTV杯”全国英语演讲大赛二等奖,全国高职高专实用英语口语大赛福建赛区一等奖,学生参加国家级、省级技能大赛荣获奖项192项;参加由国家七部委联合举办的全国高职院校最高级别比赛--第四届全国职业院校外贸技能竞赛荣获三等奖,受到省教育厅的表扬;参加省大运会荣获第一名并打破记录。赴台学生在台交流期间荣获台湾建国科技大学创业设计大赛一等奖、“校际国际贸易模拟商品展竞赛”展场设计团队奖第三名、育达行销企划大赛第二名、首届全球客家汤圆料理比赛季军等奖项。学院就业工作位居福建省高职院校前列,毕业生就业率一直保持在95%以上,毕业生深受用人单位好评,是福建省大中专毕业生就业工作先进集体。