Linux C:利用open等函数实现Linux命令行cp


1.Linux命令行cp
cp命令是将命令后的第一个参数所对应的文件复制到第二个参数所对应的文件上,如果参数不足两个则会直接报错,提示参数错误,如果第一个参数所对应的文件不存在则会报错,提示第一个参数不存在,如果第二个参数所对应的文件不存在,则会创建并继续指令。

cp file1 file2


2.实现逻辑
分析完cp指令之后,本程序的设计思路就已经很清晰了:
1. 在main函数的接口处设计两个参数,并在一进入main函数就对argc进行判断,如果小于3 就打印错误并直接退出。
2. 当参数没有问题后,就对第一个参数进行判断,使用open函数打开,里面的oflag使用O_RDWR (可读可写) 和O_EXCL (存在判断)。对返回值进行判断,如果是-1,就打印第一个文件不存在并退出程序。
3. 当第一个文件的存在判断通过后,使用read函数将文件中的内容读取到缓冲区中。这一步操作中需要考虑的点在于,缓冲区的数组应该分配多大空间呢?是128个字节?256个字节?这个时候就可以用到前面博文中使用的利用 lseek函数的返回值计算文件大小的方法来动态调整缓冲字符串的大小了。
4. 读取完成后,就是写入操作了。使用open函数打开第二个参数所对应的文件,oflag使用O_RDWR,O_CREAT (文件不存在时创建它),O_TRUNC(文件存在时清空它)三个宏。打开后,用write函数将缓冲区的内容写入到文件中即可完成所有操作。记得使用close函数关闭两个文件。

关于arg的补充:
int main ( int argc, char **argv )
argc:参数个数argument counter
argv:参数内容argument value
比如指令:
cp file1 file2
argc = 3
argv[0] = "cp"
argv[1] = "file1"
argv[2] = "file2"

以上是我昨晚睡不着觉写的提纲,今天将程序实现逻辑分析了一下。今天将代码补全的时候发现些许问题。

首先,对于:

O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值

这个宏,需要和O_CREAT一起使用,单纯判断文件是否存在用 O_RDWR ,然后判断返回值就行了。

然后就是在读取数据缓冲区字符串的地方,设置指针需要给它开辟空间。(小问题)

贴出代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int fd_read;
    int fd_write;
    int n_read;
    int n_write;
    char *readbuf = NULL;
    int len_readbuf;

    if(argc < 3)
    {
        printf("Param error\n");
        printf("%s filename1 filename2\n", argv[0]);
        exit(-1);
    }

    fd_read = open(argv[1], O_RDWR);
    if (fd_read < 0)
    {
        printf("cannot find %s\n", argv[1]);
        exit(-2);
    }

    len_readbuf = lseek(fd_read, 0, SEEK_END);  //计算file1的长度
    lseek(fd_read, 0, SEEK_SET);                //重新将光标移到文件开始

    readbuf = (char *)malloc(sizeof(char) * len_readbuf +1);
    n_read = read(fd_read, readbuf, len_readbuf);

    fd_write = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0666);
    n_write = write(fd_write, readbuf, n_read); 
    if(n_write == -1)
    {
        printf("fail to write\n");
    }

    close(fd_read);
    close(fd_write);    

}

 编译代码时命名成mycp,就即刻完成。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值