Linux系统编程之模拟命令cp

linux+c函数库《1》_初级I/O接口(open、close、stat、sync、access、lseek、unlink)、目录接口(remove、mkdir、readdir、closedir) Linux C 函数库(以最常用的 glibc 为例)包含成千上万的函数,覆盖从基础工具到系统交互的几乎所有功能。使用 man 命令:例如 man -f open # 查看所有包含 “open” 的文档。也可以通过在线文档:glibc 官方文档或 Linux 手册页查询。 阅读详情

最近在学习linux环境编程,用学到的文件编程写了一个模拟命令 cp的代码,当然有很多不足之处,但是基本功能都实现了。 文件编程用到的函数不明白的可以百度。其实学这个也只是为了加深对Linux系统的理解。代码有什么问题请回复,方便大家交流学习。

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <dirent.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <string.h>

#include <fcntl.h>

#define BUFFERSIZE 10000

int isdir(char *src)

{



    struct stat is_dir;

    //lstat函数把源文件名的文件类型和存储权限传给stat结构体中的st_mode变量 

    lstat(src, &is_dir);

    //S_ISDIR函数判断该文件是不是目录文件 

    if(S_ISDIR(is_dir.st_mode))

    {

        return 1;

    }

    return 0;

}

//文件拷贝到文件 或文件拷贝到目录下 

int copyF2F(char *src_file, char *dest_file)

{

    int in_fd, out_fd, n_chars;



    char buf[BUFFERSIZE];

    //如果目的地址是目录,则默认在该目录下创建一个与源文件同名的文件   

    if(isdir(dest_file))

    {

        char c;

        char temp[10] = {'\0'};

        char r_temp[10] = {'\0'};

        int n = strlen(src_file);

        int m = 0;

        //记录源文件最后一个'/'之后的内容 

        while((c = src_file[n-1]) != '/')

        {

            //用temp数组存下来 

            temp[m] = c;

            m++;

            n--;

        }

        int j = 0;

        //由于temp数组存下来的字符是反的,所以反转一下字符 

        for(int i = strlen(temp)-1; i >=0; i--)

        {

            r_temp[j] = temp[i];

            j++;

        }

        r_temp[j] = '\0';

        //将源文件的最后的文件名和目的文件目录拼接起来 

        strcat(dest_file, r_temp);

    }

    //打开源文件,获取到文件描述符,失败返回-1 

    if((in_fd = open(src_file, O_RDONLY)) == -1)

    {

        printf("%s is error", src_file);

        return 1;

    }

    //打开目的文件,获取文件描述符,失败返回-1,注意此时需要写的权限所以参数应该有O_WRONLY,并且如果不存在需要有权限创建。具体的函数用法参照上之前写的文件I/O编程博客 

    if((out_fd = open(dest_file, O_WRONLY | O_CREAT, 0644)) == -1)

    {

        printf("open is error");

        return 1;

}

    //现在源文件和目的文件的文件描述符都获取到了,开始复制。read函数第一个参数代表要读出的文件描述符,第二个参数代表存数据的数组首地址,第三个参数代表要读出多少个字节。读取成功返回读取的字节数,有错返回-1 

    if((n_chars = read(in_fd, buf, BUFFERSIZE))>0)

    {

        //写入目标文件中。错误返回-1 

        if(write(out_fd, buf, n_chars)<0 )

        {

            printf("%s write error", dest_file);

            return 1;

        }

    }

    //close函数用于关闭文件,打开文件了记得关 

    if(close(in_fd) == -1 || close(out_fd) == -1)

    {

        printf("error");

        return 1;

    }

    return 0;

}

//目录拷贝到目录下 

int copyD2D(char *src_dir, char *dest_dir)

{

    //用来获取打开文件目录时返回的指针 

    DIR *dp = NULL;

    struct dirent *dirp;

    char tempDest[256];

    char tempSrc[256];

    strcpy(tempDest, dest_dir);

    strcpy(tempSrc, src_dir);

    //opendir打开文件目录,返回NULL代表打开失败 

    if((dp = opendir(src_dir)) == NULL)

    {

        return 1;

    }

    else

    {

        //readdir()返回参数dir目录流的下个目录进入点 

        while((dirp = readdir(dp)))

        {

            if(isdir(dirp->d_name))  //d_name是文件的名称 

            {

                strcat(tempDest, dirp->d_name);     

                strcat(tempSrc, dirp->d_name);

                //将目录中的文件拷贝到另一个目录中 

                copyF2F(tempSrc, tempDest);

                //把tempDest和tempSrc重新初始化成目录名 

                strcpy(tempDest, dest_dir);

                strcpy(tempSrc, src_dir);

            }

        }

        //关闭打开的目录 

        closedir(dp);

        return 0;



    }

}



int main(int argc, char * argv[])

{

    int c, flag = 0;

    while((c = getopt(argc, argv, "rRls"))!=-1)

    {

        switch(c)

        {

            //选项为-R或-r时,执行目录之间的拷贝 

            case 'R':

            case 'r':

                copyD2D(argv[2], argv[3]);

                flag = 1; 

                break;

            //选项为-l时,创建链接 

            case 'l':

                if(isdir(argv[2]))

                {

                    printf("dir can't create a link");

                    exit(1);

                }

                if(link(argv[2], argv[3])==0)

                {

                    return 0;

                }

                else

                {

                    printf("create a link failed");

                }

                flag = 1;

                break;

            case 's':

                if(isdir(argv[2]))

                {

                    printf("dir can't create a symlink");

                }

                if((symlink(argv[2], argv[3])) == 0)

                {

                    return 0;

                }

                else

                {

                    printf("create a symlink failed");

                }

                flag = 1;

                break;

        }

    }

    if(flag == 0)

    {

        copyF2F(argv[1], argv[2]);

    }

    return 0; 

}
CP命令实现(linux下C语言)edsionte.com linux新手区:www.edsionte.com linux下C语言实现cp命令。主要功能有: 1.将一个文件拷贝到指定路径。(目的文件可存在也可不存在)。这是my_cp中最基本的功能,事实上2,3,4功能最终都会被分解成此功能。 2.将一个目录拷贝到指定目录下,此时必须加-R或-r选项。 3.将多个目录拷贝到指定目录下,此时必须加-R或-r选项。 4.将多个文件拷贝到指定目录下。这里的源文件即包含目录文件也包含普通文件。 立即下载

相关推荐

cp指令的简单实现

Linux C简单实现cp指令,复制文件,文件夹,但是没有用户交互和操作选项

使用linux系统IO函数实现 `cp`指令的功能

使用linux系统IO函数实现 `cp`指令的功能

Little Big Us的博客 808

西门子 标准程序解读---> 机器手抓取和涂胶控制程序

摘要 该程序实现机械手在OP70/OP90工位的自动化控制,核心功能包括: 流程控制:分段(Seg1-Seg11)管理抓件、涂胶、放件等动作,结合DB1050/DB1250数据块监控工位状态及变位机位置反馈。 安全机制:配置干涉区(FC124)、实时检测安全光/急停信号,防止碰撞;服务程序(FB191)支持维修位触发与安全隔离。 参数配置:通过DB块关联机器人速度、节拍(FB27)、车型编码(如空过=2)及手自动模式(DB70.DBX21.2)。 应用场景:适用于汽车焊接/装配线

工控智联驿站 1239

Linux下文件IO编程-----实现cp命令

cp命令实现原理及代码一、 思路想法二、 代码部分 一、 思路想法 解析命令行参数,程序名后的第一个参数为待复制文件,第二个为复制目的地的文件名子以及路径。 利用基本文件IO系统调用函数,open、read、write进行文件的读取以及新文件的写。 由于无法事先知道待复制的文件大小,无法做到一次读和写,解决办法当然是使用循环。 并且设置循环终止为读到的文本为0 byte时候,因为每读一次,如果读取buf小于文件大小,文件偏移量会移到读完的该buf大小的文本字节处,下一次读取便是继续读取,当读取到没有文本

WH^2 1349

openai联合创始人用1000行纯C语言手搓的GPT-2训练代码

不久之前,特斯拉前 AI 总监、OpenAI 联合创始人 Andrej Karpathy 在社交媒体平台 X 上高调宣布,他友好地从 OpenAI 离职,未来将专注于“个人项目”,而后又口口声声说要尝试性地戒掉上网两周,去了 Bhutan(不丹王国)休假。然后就手搓如下代码,我们一起来欣赏.这段代码是一个GPT-2模型的训练实现,包括前向传播、后向传播、参数更新等过程。代码中包含了注释,解释了每个函数和代码块的作用。此外,还有一些辅助函数和结构体,用于数据加载、随机数生成和模型的初始化与释放。这个训练循环还

zhangzhechun的专栏 1212

【Gin框架入门到精通系列01】Gin框架介绍与环境搭建

本文是Gin框架入门到精通系列的第一篇,系统介绍Gin框架的基本概念、核心特性以及环境搭建。无论你是Go语言新手还是有经验的开发者,都能通过本文快速掌握Gin框架的基础知识,创建并运行你的第一个Gin应用。

GopherTribe的博客 1560

linux实现命令解释器_根据linux系统调用实现cp命令

本文利用linux系统调用中的open( )、read( )、write( )函数实现简易版的linux cp命令,供学习嵌入式 linux系统编程的小伙伴们参考/*声明:本代码只作为学习参考资料使用,不可作为其他用途,否则后果自负*/#include#include#include#include#include#include#include#ifndef BUF_SIZE...

weixin_35797090的博客 315

【论文翻译】YOLO26: KEY ARCHITECTURAL ENHANCEMENTS AND PERFORMANCE BENCHMARKING FOR REAL-TIME OBJECT DETEC

本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其在实时边缘目标检测领域的关键架构改进与性能基准测试结果。YOLO26于2025年9月发布,是YOLO系列中最新、最先进的模型,专为在边缘设备和低功耗设备上实现高效能、高精度和部署就绪性而设计。论文依次详细介绍了YOLO26的架构创新,包括移除分布焦点损失(DFL)、采用端到端无非极大值抑制(NMS)推理、集成渐进式损失(ProgLoss)和小目标感知标签分配(STAL),以及引入MuSGD优化器以实现稳定收敛。

Limiiiing的博客 1683

Unix/Linux基本文件操作—之cp命令

一、问题描述 基于系统调用的操作方法与通过C语言标准库函数的方法相比,运行机制有着本质的区别。 这里使用两种方法编写程序实现相同功能的程序,来对比他们之间的不同。 程序实现【文件】复制命令"cp"的功能 : 二 、实现代码 BUG 描述: 当参数1存在的情况下,而参数2是路径 而没有表明是文件 这时的cp命令会失败!以下代码在判断后面提示无论目录书中任何路径必须用户自定义一个存在或不存在的...

浓烟下的诗歌电台 782

使用CubeMX配置STM32H7的FreeRTOS

本文将介绍如何使用CubeMX配置STM32H7的FreeRTOS,并提供相应的源代码示例。通过使用CubeMX,你可以轻松地配置FreeRTOS和系统资源,并生成相应的初始化代码和配置文件。在"FreeRTOS"选项卡的"Tasks"部分,可以配置系统中的任务。首先,打开CubeMX软件。在"FreeRTOS"选项卡的"Resources"部分,你可以配置FreeRTOS使用的资源,例如,堆内存和信号量。例如,我们可以创建两个简单的任务,一个任务将在循环中切换LED的状态,另一个任务将通过串口打印消息。

JeeVue的博客 711

深入URP之Shader篇5: SimpleLit Shader分析(1)

本篇开始分析simple lit shader。我们通过分析unlit shader了解了URP shader的结构,以及一些基础功能。而simple lit shader包含了更多的内容。本篇开始,就不会特别仔细的逐行去分析shader文件了,只会针对pass的功能中比较有意思且之前没看到过的内容进行分析。名字为的pass,它的Tags为: 根据URP的文档:说明这是一个前向渲染路径的pass,虽然URP(至少是10.8.1版本)还没有正式支持Deferred Rendering,但URP已经为它打了很多

聚焦游戏和图形引擎开发技术 1901

Linux 使用系统函数实现 cp命令 (open、write、read)

大啊的

weixin_45715405的博客 2254

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[zt] Linux 下几个文件操作命令的代码实现

http://www.ibm.com/developerworks/cn/linux/l-cn-commands/index.html?ca=drs-简介: 本文主要讲述 cp、mkdir、rm、tac、df 五个命令主要功能的模拟实现代码。让读者学会使用 strace 来跟踪系统调用的使用情况。加深读者对操作系统的认识与理解,引导读者学习 Linux 系统编程。本文章中的示例代码是在 CentOS 5.4 64 位环境下运行通过的,在其它 unix 系统上没有测试过。Linux 操作系统中的命令实际上是编

pisheng的专栏 757

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux 下几个文件操作命令的代码实现

主要讲述 cp、mkdir、rm、tac、df 五个命令主要功能的模拟实现代码。让读者学会使用 strace 来跟踪系统调用的使用情况。加深读者对操作系统的认识与理解,引导读者学习 Linux 系统编程。 本文章中的示例代码是在 CentOS 5.4 64 位环境下运行通过的,在其它 unix 系统上没有测试过。 Linux 操作系统中的命令实际上是编译好的可执行程序,

职场里拉开差距的不是知识,而是认知! 1280

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux下几个文件擦做命令代码实现

http://www.ibm.com/developerworks/cn/linux/l-cn-commands/ Linux 下几个文件操作命令的代码实现 用 C 语言实现命令 cp、df、mkdir、rm、tac 本文主要讲述 cp、mkdir、rm、tac、df 五个命令主要功能的模拟实现代码。让读者学会使用 strace 来跟踪系统调用

958

C语言实现的综合小项目

1、C语言制作简单计算器 项目用C语言做一个简单的计算器,进行加、减、乘、除操作。    2、C语言实现通讯录 项目使用C语言完成一个简单的通讯录。会涉及到结构体、数组、链表等重要概念。 3、C语言利用epoll实现高并发聊天室 项目实现客户端和服务端编程,服务端使用epoll机制,高并发必备,支持多客户聊天室聊天;客户端使用epoll和fork,父进程与子进程通过pipe通信。 4、C语言编写万年历 使用C语言完成一个简单的日历功能。输入相应的年/月即可看到当月的日历。 5、C语言制作2

qq_41115033的博客 1188

用C语言实现Linux系统的cp指令

在实现cp指令之前,首先先要了解这样一个概念,我们平时在写代码时 int main() 这个括号里省略了3个参数。 int main(int argc,char** argv,char** environ) //argc 表示参数的数量 //argv 是一个字符串数组,里面按顺序存储着每一个参数的名字。 //environ 是环境变量,我们现在暂时用不到。 了解了这个之后我们...

weixin_43716607的博客 2413

【Linux】C语言系统函数实现cp命令

🔥❤️cp命令是 Linux 和类 Unix 系统中常用命令,用于复制文件和目录。基本用法: 命令的基本语法是将源文件复制到目标文件 这会将 复制到 中。如果 已经存在,将会被覆盖。同时复制多个文件: 命令可以同时复制多个文件到目标目录中。 这会将 、 等文件复制到 目录中。递归复制目录:如果 命令的目标是一个目录,且使用了 或 选项, 命令将会递归地复制整个目录结构。 保留文件属性:使用 或 选项可以保留源文件的属性(包括所有者、权限、时间戳等)。 交互模式:使用 或

代码兴国 1741

模拟实现Linux下cp命令

首先要了解cp命令,可以通过man手册进行查看。 接下来分析以下可能出现的几种情况: 以下是代码:#include <stdio.h> #include <unistd.h> #include <sys/stat.h> #include <stdlib.h> #include <string.h> #include <dirent.h> void cp_dir(const char *src

mxrrr_sunshine的博客 2359

linux中cp命令的常见用法

本篇博客来讨论linux中cp命令。cp命令用来复制文件或文件夹。它主要有两种形式# 用法一:复制一个文件 $ cp [option] src-file target-file# 用法二:复制多个文件,目标是一个文件夹 $ cp [option] src-file1 src-file2 ... target-directory如果一次复制多个文件的话,target必须是一个文件夹。下面是几个常用的选

朱登凯的专栏 4万+

linux命令-cp与rsync命令详解

cp 是 Linux 中基础的本地文件复制工具,主要用于简单、一次性任务,如复制文件/目录、创建硬链接或软链接,支持递归复制和保留部分文件属性(如权限、时间戳),但无法高效处理增量更新或远程传输。而 rsync 是高级同步工具,专为高效数据传输设计,支持增量同步(仅传输变化部分)、本地与远程路径(如 SSH)、带宽控制、断点续传、文件排除规则及完整元数据保留(包括 ACL 和扩展属性)。rsync 在频繁更新、跨网络备份或大规模数据迁移中效率显著,而 cp 更适合快速完成无需复杂逻辑的本地复制任务。

鸭梨山大。 1436

linux下使用文件操作模拟cp命令(初级版)

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <assert.h> #include <fcntl.h> #include <sys/stat.h> int main(int arg...

GoingJack博客 491
上一篇: gdb的基本使用命令清单
下一篇: 数据链路层-循环冗余检验
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值