自己實現linux CP指令
實現cp指令的思路:
- 打開要復制的原文件
- 讀原文件的內容到buf
- 打開或者創建要粘貼的文件
- 將buf里面的內容寫到目標文件
- 關閉兩個文件
main 函數的標準原型:
main 函數的標準原型應該是 int main(int argc, char *argv[]);argc 是命令行參數的個數。而 argv 是一個指向指針的指針,為什么不是指針數組呢?因為前面講過,函數原型中的[]表示指針而不表示數組,等價于 char **argv 。那為什么要寫成 char *argv[] 而不寫成 char **argv 呢?這樣寫給讀代碼的人提供了有用信息,argv 不是指向單個指針,而是指向一個指針數組的首元素。數組中每個元素都是 char * 指針,指向一個命令行參數字符串。
demo:
#include<stdio.h>
int main(int argc,char *argv[])//argc表示參數的個數,argv表示字符串數組是二級指>針
{printf("參數總個數是:%d\n",argc);printf("第一個參數是:%s\n",argv[0]);printf("第二個參數是:%s\n",argv[1]);printf("第三個參數是:%s\n",argv[2]);return 0;
}程序運行的結果:
fhn@ubuntu:~/linuxfile$ ./cpfile src des
參數總個數是:3
第一個參數是:./cpfile
第二個參數是:src
第三個參數是:des
實現cp指令:
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
int main(int argc,char *argv[])//argc表示參數的個數,argv表示字符串數組是二級指針
{int fd;int fd2;int size;int n_read;int n_write;char*readbuf=NULL;if(argc!=3){printf("輸入參數個數有誤\n");exit(0);//正常退出 }fd=open(argv[1],O_RDONLY);if(fd==-1){printf("文件打開錯誤\n");perror("open");exit(0);}size=lseek(fd,0,SEEK_END);readbuf=(char*)malloc(sizeof(char)*size+8);lseek(fd,0,SEEK_SET);n_read=read(fd,readbuf,sizeof(char)*size+8);if(n_read==-1){printf("文件讀取錯誤\n");perror("read");exit(0);}fd2=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);if(fd2==-1){printf("目標文件打開失敗\n");perror("open");exit(0);}n_write=write(fd2,readbuf,strlen(readbuf));if(n_write==-1){printf("文件寫入失敗");perror("write");exit(0);}close(fd);close(fd2);return 0;
}
配置文件的修改:
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
int main(int argc,char *argv[])//argc表示參數的個數,argv表示字符串數組是二級指針
{int fd;int size;int n_read;int n_write;char* find=NULL;char* readbuf=NULL;if(argc!=2){printf("輸入參數個數有誤\n");exit(0);//正常退出 }fd=open(argv[1],O_RDWR);if(fd==-1){printf("文件打開錯誤\n");perror("open");exit(0);}size=lseek(fd,0,SEEK_END);lseek(fd,0,SEEK_SET);readbuf=(char*)malloc(sizeof(char)*size);n_read=read(fd,readbuf,size*sizeof(char));if(n_read==-1){printf("文件讀取錯誤\n");close(fd);perror("read");exit(0);}find=strstr(readbuf,"heigh=");if(find==NULL){printf("配置文件中沒有要修改的內容\n");close(fd);exit(0);}find=find+strlen("heigh=");*find='1';*(++find)='8';*(++find)='0';lseek(fd,0,SEEK_SET);n_write=write(fd,readbuf,strlen(readbuf));if(n_write==-1){printf("寫入失敗\n");close(fd);perror("write");exit(0);}close(fd);return 0;
}
寫一個整數到文件:
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int fd;int a=110;int b=0;fd=open("./test.config",O_RDWR|O_APPEND);write(fd,&a,sizeof(int));lseek(fd,-4,SEEK_END);//因為寫入的是整型,所以光標要移動4個字節read(fd,&b,sizeof(int));printf("寫入的是:%d\n",b);close(fd);return 0;
}#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int fd;short int a=110;int b=0;fd=open("./test.config",O_RDWR|O_APPEND);write(fd,&a,sizeof(short int));lseek(fd,-2,SEEK_END);read(fd,&b,sizeof(int));printf("寫入的是:%d\n",b);close(fd);return 0;
}
寫結構體到文件:
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
struct Test
{int a;char b;
};
int main()
{int fd;struct Test Data1={1,'a'};struct Test Data2;fd=open("./test.config",O_RDWR|O_APPEND);write(fd,&Data1,sizeof(struct Test));lseek(fd,-8,SEEK_END);read(fd,&Data2,sizeof(struct Test));printf("結構體大小是:%d\n",(int)sizeof(struct Test));printf("寫入的是a=%d,b=%c\n",Data2.a,Data2.b);close(fd);return 0;
}
寫結構體數組到文件:
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
struct Test
{int a;char b;
};
int main()
{int fd;struct Test Data1[2]={{1,'a'},{2,'b'}};struct Test Data2[2];fd=open("./test.config",O_RDWR|O_APPEND);write(fd,&Data1,sizeof(struct Test)*2);lseek(fd,-16,SEEK_END);read(fd,&Data2,sizeof(struct Test)*2);printf("寫入的是a=%d,b=%c\n",Data2[0].a,Data2[0].b);printf("寫入的是a=%d,b=%c\n",Data2[1].a,Data2[1].b);close(fd);return 0;
}