目录
1、main函数参数
2.cp指令的使用
3、实现cp指令
3.1实现cp指令-入门版
3.2实现cp指令-进阶版
1、main函数参数
int main(int argc,char *argv[])
{
return 0;
}
C语言规定了main函数的参数只能由2个,一个是argc,一个是argv,并且argc只能是整数,第二个必须是指向字符串的指针数组。
由于main函数不能被其他函数调用,因此不可能在程序内部取得实际值。那么,在何处把参数值赋予main函数的形参呢?实际上,main函数的参数值从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去,DOS提示符下命令行的一般形式为:
C:>可执行文件名 参数 参数......;但是应该特别注意的是,main的两个形参和命令行中的参数在位置上不是一一对应的。
- argc:参数表示命令行中参数的个数(注意 文本名本身也是一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。
- arfv:参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。指针数组的长度即为参数个数。数组元素初值由系统自动赋予。
- vi test.c 进入文件,
- 编译后,输入命令 ./a.out src des param total 3
param first is ./a.out param second is src param third is des
2.cp指令的使用
-
demo1.c 和demo2.c 里面的内容完全一样。
3、实现cp指令
3.1实现cp指令-入门版
src 源文件 des 目标文件
执行流程:
- 打开源文件(src) open
- 打开目标文件(des) open
- 写入目标文件 write
- 读取src文件到缓存数组 read
- 关闭目标文件和源文件 close
- ./a.out src.c des.c
- vi demo.c 创建demo.c文件
- 写入代码
- 实现cp指令的功能
- 查看demo1.c里面的内容
- 查看demo2.c里面的内容
- 比较demo1.c 和demo2.c的内容,发现仅仅将1024byte的内容写入demo2.c,功能正常。
3.2实现cp指令-进阶版
src 源文件 des 目标文件
执行流程:
- 打开源文件(src) open
- 打开目标文件(des) open
- 使用whlie循环
- 读取src文件到缓存数组 read
- 写入目标文件 write
- 关闭目标文件和源文件 close
- ./a.out src.c des.c
- vi demo.c 创建demo.c文件
- 进入编辑代码
- 编译代码
- 比较src 和 des
- 这次就很完美的实现了。
代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//int open(const char *pathname, int flags);
//int open(const char *pathname, int flags, mode_t mode);
#include <unistd.h>
//int close(int fd);
#include <unistd.h>
//int close(int fd);
#include <string.h>
int main(int argc,char *argv[])
{
int src_fd;
int des_fd;
char readBuff[1024] = {0};
int nRet = 0;
if(argc != 3)
{
printf("error\n");
return -1;
}
src_fd = open(argv[1],O_RDWR);
if(src_fd < 0)
{
printf("open file %d failed!\n",src_fd);
}
des_fd = open(argv[2],O_RDWR | O_CREAT,0755);
if(des_fd < 0)
{
printf("open file %d failed!\n",des_fd);
}
while(1)
{
nRet = read(src_fd,&readBuff[0],128);
if(nRet <128)
{
break;
}
write(des_fd,readBuff,nRet);
memset(readBuff,0,128);
}
write(des_fd,readBuff,nRet);
close(src_fd);
close(des_fd);
return 0;
}