首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中复制Linux命令

在C中复制Linux命令
EN

Code Review用户
提问于 2020-05-14 07:41:33
回答 1查看 57关注 0票数 2

我有以下用C语言编写的代码,它从linux复制mv (move)命令的功能。问题是代码效率很低。如何在不过多更改结构的情况下优化代码或使代码更高效?

代码语言:javascript
复制
#include    <limits.h>
#include    <fcntl.h>
#include    "ourhdr.h"
#include    <sys/stat.h>
#include    <dirent.h>
int main(int argc,char *argv[])
{
    if(argc!=3)
    {
        printf("<Sintaxa> <fisier sursa> <fisier destinatie> \n");
        exit(1);
    }
    int ren1,ren2;
    struct stat buf1;
    struct stat buf2;
    lstat(argv[2],&buf1);
    lstat(argv[1],&buf2);
    char src[PATH_MAX];
    strcpy(src,argv[1]);
    char dst[PATH_MAX];
    strcpy(dst,argv[2]);
    int src_size = (int)strlen(src);
    int dst_size = (int)strlen(dst);
    dst[dst_size] = '/';
    dst[dst_size + 1] = '\0';
    dst_size++;
    int i;
    int index=0;
    int index1=src_size;
    while(--index1>0)
    {
        if(src[index1]=='/')
        {
            index1=0;
        }
        else
            index++;
    }
    for (i = src_size-index-1; i < src_size; i++)
    {
        dst[dst_size++] = src[i];
    }
    dst[dst_size] = '\0';
    if (access(src,F_OK)==-1)
    {
        err_ret("%s: cannot stat '%s'", argv[0],argv[1]);
        return -1;
    }
    if(S_ISDIR(buf1.st_mode))
    {
        if(((S_ISDIR(buf2.st_mode))&&(!(opendir(argv[1]))))||(!(opendir(argv[2]))))
        {
            err_quit("%s: cannot move '%s' to '%s': Permission denied \n", argv[0],argv[1],dst);
        }
        ren1=rename(src,dst);
        if(ren1!=0)
        {
            err_quit("Error: unable to move the file");
        }
    }
    else
    {
        ren2=rename(argv[1],argv[2]);
        if(ren2!=0)
        {
            err_quit("Error: unable to rename the file ");
        }
    }
}

上面的代码运行良好,但效率很低。

EN

回答 1

Code Review用户

发布于 2020-05-15 11:24:12

这是一个小程序,所以有些问题不大可能。如果这是API的一部分,那么问题就会层出不穷,然后产生实际的差异。

有几点你应该去做:

  • opendir泄漏:opendir打开一个文件描述符。您打开两个目录,其中没有一个是关闭的。一定要打电话给closedir。如果这是API的一部分,那么这些内存泄漏就会堆积起来。否则,这可能不是一个问题,因为当过程结束时,应该自动清除描述符。
  • 错误检查:如果我多次运行这段代码,其中一些代码的目的是以错误结尾,那么由于错误检查的位置,会有一些杂乱无章的地方。应该首先进行诸如src是否存在或是否可以访问dst dir之类的检查。这将消除一些行动的需要。通常,最好先执行错误检查。
  • 查找名称:代码的很大一部分用于查找src的名称并将其复制到dst。您可以通过使用内置函数来改进它。使用strrchr查找最后一个/strcpy来复制名称。

也许还有其他可能的变化,但这应该是它的要点。这些问题中的大多数影响很小。这是一个小程序,所以您不会注意到必须进行性能更改(除非这是一个API)。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/242248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档