原创首发于CSDN,文章转载请注明出处,加上原文链接,谢谢!
https://blog.csdn.net/weixin_46959681/article/details/112156151
主函数main
参数打印
在主函数 main
中一共有两个参数 int argc, char **argv
。对于程序来说,所有的一切都是程序名开始的。在原来的cp指令实现中,cp、src.c、des.c 三者分别对应参数 0、1、2 ,一共三个参数。这三个参数属于主函数 main
中的 int argc
。第二个参数 char **argv
是一个二级指针,其所有元素都是一个字符型数组。argv[0]
对应 cp 含有两个字符元素的数组,argv[1]
对应 src.c 含有五个字符元素的数组, argv[2]
也对应 des.c 含有五个字符元素的数组。
对以上内容进行编程检测,源代码如下:test1.c
/* test1.c */
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Total params: %d\n", argc);
printf("No.1 params: %s\n", argv[0]);
printf("No.2 params: %s\n", argv[1]);
printf("No.3 params: %s\n", argv[2]);
return 0;
}
结果如下:
基于以上结果证明,我们可以实现对应的系统指令 cp
。
指令cp
实现思路详解
- 明确C语言的参数 argc、argv;
- 打开源文件
src.c
; - 读取
src.c
的数据到文件缓冲区Buf; - 创建目标文件
des.c
; - 将文件缓冲区Buf内的数据写入目标文件内;
- 关闭 close 两个文件。
|系统指令 cp
的代码实现 mycp.c
编译文件 mycp.c
生成执行文件 mycp
/* mycp.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
//源文件、目标文件。
int fdSrc;
int fdDes;
char *readBuf = NULL;
if(argc != 3){
printf("params error.\n");
exit(-1);
}
fdSrc = open(argv[1], O_RDWR);
if(fdSrc == -1){
printf("Source file opened fial.\n");
exit(-1);
}
//使用光标进行文件内容字节数的读取统计。
int filesize = lseek(fdSrc, 0, SEEK_END);
//光标复位。
lseek(fdSrc, 0, SEEK_SET);
//读取数据进入readBuf
readBuf = (char *)malloc(sizeof(char)*filesize + 8);
read(fdSrc, readBuf, filesize);
//若无目标文件则创建(O_CREAT)并覆盖(O_TRUNC)其数据内容。
fdDes = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0600);
if(fdDes == -1){
printf("Destinative file opened fail.\n");
}
//将数据写入目标文件。
write(fdDes, readBuf, strlen(readBuf));
free(readBuf);
close(fdSrc);
close(fdDes);
return 0;
}
运行生成的文件 mycp
,使用文件 demo15.c
作为源文件。
使用指令 cat
,会发现两个文件的代码是相同的,表明我们已经成功实现使用自己的代码实现系统自带的指令 cp
。
文章更新记录
- 文章第一次成文。 「2021.1.3 22:46」
- 重新上传了第一张图片。 「2021.1.4 10:31」
- 修改了部分内容。 「2021.1.8 20:15」
- 修改文章标题。 「2021.1.18 15:41」
- 独立出了第一节内容。 「2021.3.17 21:29」
- 修改错别字。 「2021.3.18 9:50」