Linux课设-用gcc实现Linux简单命令

说明

利用gcc实现 ls , cp, pwd, cd 常用的linux命令功能

用gcc实现一些常用的linux命令功能,具体实现如下如下命令:

  • mkdir 创建目录
  • rm 删除文件或目录
  • cp 复制文件
  • cd 更改路径
  • exit 退出系统
  • pwd 打印当前路径
  • ll 列出当前路径的所有文件或目录

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
#include <dirent.h>
#include <fcntl.h>
#define MAXN 1024

void mkdirs(char dir[]) {

char str[MAXN];
strcpy(str,dir);
int len = strlen(str);
for(int i = 0;i < len; i++) {
if(str[i] == '/') {
str[i] = '\0';
if(access(str,0) != 0)
mkdir(str,0777);
str[i] = '/';
}
}
if(len > 0 && access(str,0) != 0)
mkdir(str,07770);
return;
}
void rmdirs(char dir[]) {

char dirname[MAXN];
strcpy(dirname,dir);
int ans = rmdir(dirname);
if(ans)
printf("rm:can't remove %s: No such file or directory\n",dirname);
return;
}

void exits() {
exit(0);
}

char pwds(int op) {
char buf[MAXN];
getcwd(buf,sizeof(buf));
if(op == 1) printf("[%s]$ ",buf);
else printf("%s\n",buf);
}

void cps(char file1[],char file2[]) {
int f1 = open(file1,O_RDWR|O_CREAT,0777);
int f2 = open(file2,O_RDWR|O_CREAT,0777);
char buff[MAXN];
read(f1,buff,MAXN);
int len = strlen(buff);
write(f2,buff,len);
close(f1);
close(f2);

}
void cds(char dirname[]) {

char name[MAXN];
strcpy(name,dirname);
if(chdir(name) != 0) {
printf("cd: %s :No such directory\n",dirname);
}
return;
}

void lists(char dirname[]) {

char name[MAXN];
strcpy(name,dirname);
// if(strcmp(dirname,"test") == 0)
// printf("Hello world");
//strcpy(name,"test");
DIR *dirp = NULL;
struct dirent *entry;
dirp = opendir(name);
if(dirp == NULL) {
printf("ll: %s: No such directory\n",name);
return;
}
else {
int i = 1;
while(entry = readdir(dirp)) {
printf("filename %d = %s\n",i,entry->d_name);
i++;
}
closedir(dirp);
}
}
void menu() {
bool running = true;
while(running) {
pwds(1);
char fun[MAXN];
scanf("%s",fun);
if(strcmp(fun,"exit") == 0)
exits();
else if(strcmp(fun,"mkdir") == 0) {
char filename[MAXN];
scanf("%s",filename);
int len = strlen(filename);
if(len > 512) {
printf("filename is too long\n");

}
else {
mkdirs(filename);
}
}
else if(strcmp(fun,"pwd") == 0)
pwds(0);
else if(strcmp(fun,"rm") == 0) {
char dirname[MAXN];
scanf("%s",dirname);
int len = strlen(dirname);
if(len > 512)
printf("dirname is too long\n");
else
rmdirs(dirname);
}
else if(strcmp(fun,"cd") == 0) {
char dirname[MAXN];
scanf("%s",dirname);
int len = strlen(dirname);
if(len > 512)
printf("dirname is too long\n");
else cds(dirname);
}
else if(strcmp(fun,"ll") == 0) {
char dirname[MAXN];
scanf("%s",dirname);
int len = strlen(dirname);
if(len > 512)
printf("dirname is too long\n");
else lists(dirname);
}
else if(strcmp(fun,"cp") == 0) {
char file1[MAXN],file2[MAXN];
scanf("%s%s",file1,file2);
int len1 = strlen(file1);
int len2 = strlen(file2);
if(len1 > 512) {
printf("%s filename is too long\n",file1);
continue;
}
else if(len2 > 512) {
printf("%s filename is too long\n",file2);
continue;
}
else
cps(file1,file2);
}
else
printf("Instruction error\n");
}
}
int main() {
menu();
return 0;
}

体会

写代码就是为了快乐呀。

在刚开始学linux时,基本是对着那个小黑框发呆,把书上的命令一个字符一个字符的敲进去,看着路径转换,列出所有目录或文件名,感觉大不同于之前接触到的windows的图形界面,以前在Windows上看到什么点击就可以了,而在命令行上,基本上用不到鼠标。用cd命令改变路径时,也在想这是怎么实现的,可能跟做C语言课设有点类似,在一个死循环内不断地输入字符,这些字符又被拿去匹配,看是执行什么命令。也有过疑惑,这么多的命令,这么多次的匹配,执行的速度感觉还不算太慢,是用到了什么算法,疑是字典树,哈哈,可能这就是只搞了ACM的通病吧。


其实,也在网上找过,在百度上搜索了一些命令的实现源码,也幻想过能有一天自己写的代码能够被加到Linux系统里面,哈哈。这次课程设计刚好就有一个实现Linux一些简单命令的任务,所以不用思考就选了这个了,模仿了Linux系统的输入格式界面,让当前路径在最前面显示,还抄了Linux系统的\$符号,囧rz。首先模仿的命令就是pwd命令,打印当前文件路径,往实现pwd命令的函数里传入一个用于选择的参数,分别为在$前打印路径名和就单纯的pwd命令。在重现这些命令过程中,最疑惑的就是ll命令了,输出当前路径下所有目录和文件,刚开始写的时候,一直把传入的目录名用“”括起来当成字符串处理了,这就造成了“dirname”这样一种情况,而实际上应该是dirname就可以了,在这里浪费了好多时间!


最终还是完成了啊,看着在Linux系统上运行的仿Linux命令,莫名的喜感。

-------------本文结束感谢您的阅读-------------
0%