Linux 通过系统调用复制一个文件

1.普通文件的复制

通过把read读到的数据写入一个新文件中这样的方式来复制一个文件

现在要复制文件passwd,如下图所示:

在这里插入图片描述

代码如下:

在这里插入图片描述

编译并运行:

在这里插入图片描述
可以看到文件newpasswd被创建,接下来查看文件的具体信息:

在这里插入图片描述
可以看到passwd和newpasswd的大小一样。

然后再看passwd和newpasswd两个文件的具体内容:

passwd:
在这里插入图片描述

newpasswd:

在这里插入图片描述
可以看出两个文件的内容相同。

以上操作实现了把文件passwd复制了一份为newpasswd。

2.二进制文件的复制

也通过把read读到的数据写入一个新文件中这样的方式来复制一个图片文件

现在要复制文件YY.jpg,如下图所示:

在这里插入图片描述

代码如下:

在这里插入图片描述

编译并运行:

在这里插入图片描述

可以看到文件newYY.jpy被创建,并且YY.jpg和newYY.jpg的大小一样。

【总结】

无论是字符文件还是二进制文件都可以通过read和write的系统调用来实现复制的操作。

【代码优化】

在这里插入图片描述

现在有文件passwd和YY.jpg:

在这里插入图片描述

编译运行以上代码:

在这里插入图片描述

可以通过传参直接复制文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 系统中,没有名为 `copy` 的系统调用,但可以通过组合使用其他系统调用实现文件复制。具体实现过程如下: 1. 打开原文件,获取文件描述符。 2. 创建目标文件,获取文件描述符。 3. 循环从原文件读取数据,写入目标文件,直到原文件读取结束。 4. 关闭原文件和目标文件。 具体实现可以参考下面的代码: ```c #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define BUF_SIZE 4096 int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "Usage: %s srcfile dstfile\n", argv[0]); exit(EXIT_FAILURE); } const char *srcfile = argv[1]; const char *dstfile = argv[2]; int srcfd = open(srcfile, O_RDONLY); if (srcfd == -1) { fprintf(stderr, "Failed to open %s: %s\n", srcfile, strerror(errno)); exit(EXIT_FAILURE); } int dstfd = open(dstfile, O_WRONLY | O_CREAT | O_EXCL, 0644); if (dstfd == -1) { fprintf(stderr, "Failed to create %s: %s\n", dstfile, strerror(errno)); close(srcfd); exit(EXIT_FAILURE); } char buf[BUF_SIZE]; ssize_t nread; while ((nread = read(srcfd, buf, BUF_SIZE)) > 0) { ssize_t nwritten = write(dstfd, buf, nread); if (nwritten != nread) { fprintf(stderr, "Failed to write data to %s: %s\n", dstfile, strerror(errno)); close(srcfd); close(dstfd); exit(EXIT_FAILURE); } } if (nread == -1) { fprintf(stderr, "Failed to read data from %s: %s\n", srcfile, strerror(errno)); close(srcfd); close(dstfd); exit(EXIT_FAILURE); } close(srcfd); close(dstfd); printf("Successfully copied %s to %s\n", srcfile, dstfile); exit(EXIT_SUCCESS); } ``` 注意,在上述实现中,使用了 `open`、`read` 和 `write` 等系统调用使用 `open` 系统调用需要注意文件的访问权限问题。使用 `read` 和 `write` 系统调用需要注意数据读写的正确性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值