使用linux系统IO函数实现 cp
指令的功能
cp file1 file2
就是把复制file1的内容到file2,如果file2不存在则创建file2,如果file2存在,则先清空file2再复制。
代码如下:
#include
#include
#include
#include
#include
#include
#define BUFLEN 1024
int main(int argc, char *argv[]) {
if(argc != 3) {
printf("格式错误,请输入类似于 \"mycp filename1 filename2 \"的指令");
return -1;
}
int fd1 = open(argv[1], O_RDONLY );
if( fd1 == -1) {
//说明被复制的文件不存在,这是不合理的
printf("未找到文件\" %s \"",argv[1]);
return -1;
}
int fd2 = open(argv[2], O_WRONLY | O_TRUNC);
if(fd2 == -1) {
//说明file2不存在,应该创建
fd2 = open(argv[2], O_WRONLY | O_CREAT, 0777);
}
char buf[BUFLEN];
memset(buf, 0, BUFLEN);
while(read(fd1, buf, BUFLEN) != 0) {
write(fd2, buf, strlen(buf));
memset(buf, 0, BUFLEN);
}
puts("复制成功");
return 0;
}
但是我们发现每次使用的时候必须是./myCp 1.txt 2.txt
这样的形式,很麻烦,而且如果不是在当前路径下的话还要指定可执行文件的路径,所以我们可以写一个shell脚本,以达到在任何目录下通过 mycp 1.txt 2.txt
就可以复制。
shell脚本的内容如下:
其实就是执行我们的可执行文件,其中$1 和$2是shell中的内置参数,就和argv[1],argv[2]一样,由于在C语言中已经进行了输入格式的检查,所以没必要在shell中进行输入格式的检测。
#!/bin/bash
/mnt/hgfs/code/23_8_2022/myCp $1 $2
在创建脚本文件之前应该先做以下工作:
首先 cd ~
进入家目录,然后mkdir bin
创建bin目录,随后编辑家目录下的.bashrc
文件,在这个文件中设置环境变量,就不至于每次登录都需要重新设置环境变量了,因为每次登录该用户的时候都会自动执行该文件中的所有内容。
当然在我的ubuntu18.4中是这个文件,不一样的系统和版本可能会有不同,去网上搜一下就行了。
在文件.bashrc
的头部添加export PATH="$HOME/bin:$PATH"
。
后来发现好像不用修改.bashrc
文件,因为.profile文件中默认会寻找并设置家目录下的bin目录的路径