目录
1.基础指令
ls/cd/mv/cp/pwd/tar/zip/grep/pstack/ps/netstat/mkdir/touch/rm/cat/more/less/head/tail/find/ulimit -a
2.绝对路径/相对路径
绝对路径,从根目录为起点到某一个目录的路径;
相对路径,从一个目录为起点到另外一个的目录的路径。比如../ ./
3.根目录/用户的家目录
1 ~ 代表是home目录,也就是家目录, / 代表的是根目录
2.用户登录后在 家目录 ,可用pwd命令查看,普通用户为 /home/用户名,root用户为/root 2. 用户登录后在 家目录 ,可用pwd命令查看,普通用户为 /home/用户名,root用户为/root
3.根目录是在最顶端的目录(因为已经不能cd …到上一级目录了 )3.根目录是在最顶端的目录(因为已经不能cd …到上一级目录了 ) 3.根目录是在最顶端的目录(因为已经不能cd …到上一级目录了 )3.根目录是在最顶端的目录(因为已经不能cd …到上一级目录了 )
4.根目录是所有用户的都可以操作的,家目录用户才有权限操作(管理员可以分配权限)
5./home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
4.命令行解释器
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<assert.h>
#include<string.h>
#define NUM 1024
#define OPT_NUM 64
char lineCommand[NUM];
char *myargv[OPT_NUM];//指针数组
int lastcode = 0;
int lastsig = 0;
int main()
{
while(1)
{
// 1.输出提示符
printf("lj@VM-8-2-centos 当前路径#");
fflush(stdout);
// 2.获取用户输入的命令,输入的时候,用户最后还输入了\n
char* s = fgets(lineCommand,sizeof(lineCommand) - 1, stdin);
assert(s != NULL);
(void)s; //避免Linux认为s变量未使用,导致警告
// 清除最后一个\n;例如:abcd\n
lineCommand[strlen(lineCommand) - 1] = 0;
//printf("test:%s\n",lineCommand);
// "ls -a -l -i" -->字符串分割-->"ls" "-a" "-l" "-i"
myargv[0] = strtok(lineCommand, " ");
int i = 1;
if(myargv[0] != NULL && (strcmp(myargv[0],"ls") == 0))
{
myargv[i++] = (char*)"--color=auto";
}
//如果没有子串了,strtok会返回NULL,即myargv[end] = NULL
while(myargv[i++] = strtok(NULL," "));
//如果是cd命令,不需要创建子进程,让shell自己执行对应的命令,本质就是执行系统接口
//像这种不需要让我们的子进程来执行,而是让shell自己执行的命令—内建命令
//其中echo是一个自建命令
if(myargv[0] != NULL && (strcmp(myargv[0],"cd") == 0))
{
if(myargv[1] != NULL) chdir(myargv[1]);
continue;
}
if(myargv[0] != NULL && myargv[1] != NULL && (strcmp(myargv[0],"echo") == 0))
{
if(strcmp(myargv[1],"$?") == 0)
{
printf("%d,%d\n",lastcode,lastsig);
}
else
{
printf("%s\n",myargv[i]);
}
continue;
}
//利用条件编译测试是否成功
#ifdef DEBUG
for(int i = 0; myargv[i]; ++i)
{
printf("myargv[%d]:%s\n",i,myargv[i]);
}
#endif
//执行命令
pid_t id = fork();
assert(id != -1);
if(id == 0)
{
execvp(myargv[0],myargv);
exit(1);
}
int status = 0;
pid_t ret = waitpid(id,&status,0);
assert(ret > 0);
(void) ret;
lastcode = (status >> 8) & 0xFF;
lastsig = status & 0x7F;
}
return 0;
}
6.权限
r/w/x:
一、权限对于目录的意义
1、首先要明白的是目录主要的内容是记录文件名列表和子目录列表,而不是实际存放数据的地方。
2、r权限:拥有此权限表示可以读取目录结构列表,也就是说可以查看目录下的文件名和子目录名,注意:仅仅指的是名字。
3、w权限:拥有此权限表示具有更改该目录结构列表的权限,总之,目录的w权限与该目录下的文件名或子目录名的变动有关,注意:指的是名字。具体如下:
1)在该目录下新建新的文件或子目录。
2)删除该目录下已经存在的文件或子目录(不论该文件或子目录的权限如何),注意:这点很重要,用户能否删除一个文件或目录,看的是该用户是否具有该文件或目录所在的目录的w权限。
3)将该目录下已经存在的文件或子目录进行重命名。
4)转移该目录内的文件或子目录的位置。
4、x权限:拥有目录的x权限表示用户可以进入该目录成为工作目录,能不能进入一个目录,只与该目录的x权限有关,如果用户对于某个目录不具有x权限,则无法切换到该目录下,也就无法执行该目录下的任何命令,即使具有该目录的r权限。且如果用户对于某目录不具有x权限,则该用户不能查询该目录下的文件的内容,注意:指的是内容,如果有r 权限是可以查看该目录下的文件名列表或子目录列表的。所以要开放目录给任何人浏览时,应该至少要给与r及x权限。
二、权限对于文件的意义
1、也应该明白的是文件是实际含有数据的地方,所以r、w、x权限对文件来说是与其内容有关的。
2、r权限:用于此权限表示可以读取此文件的实际内容。
3、w权限:拥有此权限表示可以编辑、添加或者是修改该文件的内容。但是不包含删除该文件,因为由上面权限对于目录的意义得知删除文件或目录的条件是什么。
4、x权限:表示该文件具有可以被系统执行的权限。文件是否能被执行就是由该权限来决定的,跟文件名没有绝对的关系。
u/g/o:
u参数代表为文件的拥有者设置权限
g参数代表为同组设置权限
o参数代表为其它人设置权限
chmod:
用来修改某个目录或文件的访问权限。
粘滞位:
即当一个目录被设置为"粘滞位"(用chmod a+t),则该目录下的文件只能由 超级管理员(root)删除或移动 该目录或文件的所有者删除 或移动
注意:
(1)虽然目录有了粘滞位,other用户不能对该目录的文件进行删除或者移动操作,但是other对该文件由w权限,还是可以进行修改文件内容的。
(2)粘滞位只对目录有效,对文件无效。
7.yum
yum install [xxx] yum remove [xxx] yum list | grep [xxxx]
更新yum源:
# 1.做好备份,防止更新失败时切换回去
$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
$ mv /etc/yum.repos.d/CentOS* /etc/yum.repos.d/CentOS-Base.repo.backup
# 2.进入yum源配置文件夹
$ cd /etc/yum.repos.d/
# 3.下载对应的新源 在yum源目录下
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 4.将新的源改名为“CentOS-Base.repo”
$ mv Centos-7.repo CentOS-Base.repo
# 5.让yum重新缓存新的数据
$ yum update -y
8.vim
正常模式 插入模式 命令模式(底行模式)一些快捷键
gcc/g++ ESc->iso
预处理:这个过程主要是处理一些#号定义的命令或语句(如宏、#include、预编译指令#ifdef等),生成*.i文件
编译:这个过程主要是进行词法分析、语法分析和语义分析等,生成*.s的汇编文件
汇编:这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制目标文件
链接(动态链接 静态链接): 静态链接和动态链接两者最大的区别就在于链接的时机不一样,静态链接是在形成可执行程序前,而动态链接的进行则是在程序执行时
什么是静态链接; 在我们的实际开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如一个源文件可能要调用另一个源文件中定义的函数,但是每个源文件都是独立编译的,即每个*.c文件会形成一个*.o文件,为了满足前面说的依赖关系,则需要将这些源文件产生的目标文件进行链接,从而形成一个可以执行的程序。这个链接的过程就是静态链接
链接器在链接静态链接库的时候是以目标文件为单位的。比如我们引用了静态库中的printf()函数,那么链接器就会把库中包含printf()函数的那个目标文件链接进来,如果很多函数都放在一个目标文件中,很可能很多没用的函数都被一起链接进了输出结果中。由于运行库有成百上千个函数,数量非常庞大,每个函数独立地放在一个目标文件中可以尽量减少空间的浪费,那些没有被用到的目标文件就不要链接到最终的输出文件中。
3.静态链接的优缺点
静态链接的缺点很明显,一是浪费空间,因为每个可执行程序中对所有需要的目标文件都要有一份副本,所以如果多个程序对同一个目标文件都有依赖,如多个程序中都调用了printf()函数,则这多个程序中都含有printf.o,所以同一个目标文件都在内存存在多个副本;另一方面就是更新比较困难,因为每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。但是静态链接的优点就是,在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。
4.动态链接
动态链接出现的原因就是为了解决静态链接中提到的两个问题,一方面是空间浪费,另外一方面是更新困难。
动态链接的优点显而易见,就是即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多分,副本,而是这多个程序在执行时共享同一份副本;另一个优点是,更新也比较方便,更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。当程序下一次运行时,新版本的目标文件会被自动加载到内存并且链接起来,程序就完成了升级的目标。但是动态链接也是有缺点的,因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。据估算,动态链接和静态链接相比,性能损失大约在5%以下。经过实践证明,这点性能损失用来换区程序在空间上的节省和程序构建和升级时的灵活性是值得的。
这个后续动静态库还有涉及
9.gdb调试
这个很重要 去百度看看
10.gitee
11.tcpdump
12.wireshark