Programación de Linux para lograr la operación de cp (notas de estudio 1)
Prefacio
Esta serie de artículos es un ejemplo de programación para que el autor aprenda Linux. He aprendido descriptores de archivos y API relacionadas antes. Si hay alguna deficiencia, por favor comente y corríjame.
Sugerencia: El siguiente es el contenido de este artículo, los siguientes casos son para referencia
1. Ideas de realización
Permítanme presentarles cp
este comando primero . La cp
ortografía completa en inglés se copy
traduce en copiar. El uso es muy simple. Aquí se explican los parámetros de uso común. Aquí solo se explica un directorio de copia -R. Uso:CP {源文件} {目标目录}
- Archivo de código abierto
src
(marcado) src
Leer el contenido de la archivobuf
en- Abrir y crear nuevo
des
- El
buf
contenido está escrito endes
el close
Dos archivos
# 二 、 Siga los pasos ## 1. Descripción de referencia de parámetro formal
Al principio no entendí por qué los resultados argc = 3
, la función principal de main
un total de dos parámetros int argc, char **argv
. Para los programas, todo comienza con el nombre del programa. En la cp
implementación de la instrucción original , los cp、src.c、des.c
tres corresponden a parámetros respectivamente , y hay tres parámetros 0、1、2
en total. Estos tres parámetros que pertenecen a la función principal main
de int argc
. El segundo parámetro char **argv
es un puntero secundario, todos los elementos de los cuales son una matriz de caracteres. argv[0]
Correspondiente a cp
una matriz que contiene los dos elementos de los caracteres, argv[1]
el src
elemento de matriz correspondiente contiene tres caracteres, argv[2]
pero también el des
elemento de matriz correspondiente que contiene tres caracteres.
El código es el siguiente (ejemplo):
#include<stdio.h>
int main(int argc,char **argv){
printf("param number is %d\n",argc);
printf("NO.1 param is %s\n",argv[0]);
printf("NO.2 param is %s\n",argv[1]);
printf("NO.3 param is %s\n",argv[2]);
return 0;
}
Los resultados de la ejecución son los siguientes:
Con base en los resultados anteriores, podemos realizar el comando del sistema correspondiente cp.
2. Programación para lograr cp
El archivo compilado demo3.c
es un archivo ejecutable generado demo3
que involucrawrite,read,lseek,malloc等API的使用
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fdSrc;
int fdDes;
int n_write;
int n_read;
char *readBuf ;
int n_file;
if(argc != 3)
{
printf("param error!\n");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR);
//int open(const char *pathname, int flags, mode_t mode);
//ssize_t write(int fd, const void *buf, size_t count);
n_file = lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readBuf = (char *)malloc(sizeof(char)*n_file + 8);
n_read = read(fdSrc,readBuf,n_file);
//ssize_t read(int fd, void *buf, size_t count);
// close(fd);
// fd = open("./file1",O_RDWR);
fdDes = open(argv[2],O_RDWR|O_CREAT,0600);
n_write = write(fdDes, readBuf,strlen(readBuf));
printf("I have read %d bytes \n",n_read);
close(fdSrc);
close(fdDes);
return 0;
}
Llame demo3
, demo3.c
usaremos nuestra cp
copia para demo5.c
:
Usar cat
comando para ver demo5.c
:
Usar comando cat
, encontrará que los códigos de los dos archivos son los mismos, lo que indica que hemos implementado exitosamente las instrucciones que vienen con el sistema usando nuestro propio códigocp
3. Registro de actualización de artículos
- 2021.3.17 escrito por primera vez
malloc
Abra espacio y utilícelo para lseek
ver el tamaño del archivo (tiempo adicional cuando tenga tiempo)