linux中cp命令如何用 C语言实现 (linux strcat)

直接下载一下cp 指令的源码,看看不就行了

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, *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  \n”衫宽颤);

my_err(“arguments error “, __LINE__);

    }

    

    frd = open(argv,O_RDON);

    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;

    stat(argv,&des_st);

    if (S_ISDIR(des_st.st_mode)) { //目标路径是目录,则使用源文件的文件名

len = strlen(argv);

pSrc = argv + (len-1); //指向最后一个字符

/*先找出源文件的文件名*/

while (pSrc >= argv && *pSrc != ‘/’) {

pSrc–;

}

pSrc++;//指向源文件名

len = strlen(argv); 

// . 表示复制到当前工作目录

if (1 == len && ‘.’ == *(argv)) {

len = 0; //没有申请空间,后面就不用释放

pDes = pSrc;

}

else { //复制到某目录下,使用源文件名

pDes = (char *)malloc(sizeof(char)*PATH_LEN);

if (NULL == pDes) {

  my_err(“malloc error “, __LINE__);

}

strcpy(pDes,argv);

if ( *(pDes+(len-1)) != ‘/’ ) { //目录缺少最后的’/’,则补上’/‘

  strcat(pDes,”/”);

}

strcat(pDes+len,pSrc);

}

    }

    

    /* 打开目标文件, 使权限与源文件相同*/ 

    fwd = open(pDes,O_WRON | 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这个命令


数据运维技术 » linux中cp命令如何用 C语言实现 (linux strcat)