lqh@lqh:~$
lqh:用户名
lqh:机器名
~:当前位于家目录
普通用户 /home/ + 用户名
超级管理员用户 /root
$:当前登录的是普通用户
#:表示当前登录的是超级管理员用户
ls
ls -ail
常规用法
cd + 绝对路径/相对路径
特殊用法
cd – 跳转到上次工作的目录
创建一个空目录
mkdir mytest
创建一个非空目录/如果存在则跳过不存在则创建
mkdir -p
cp 源文件 目标路径/
mv 源文件 目标路径/
创建一个空文件
当文件不存在的时候新建
文件存在会更新时间戳 但是不会修改文件里的内容
查看文件里的内容
删除文件
-rf 强制删除
删库跑路 rm -rf /(不要轻易尝试)
压缩文件
tar cvf 123.tgz test 1.c 2.c
解压缩
tar xvf 123.tgz -C /
更改文件的权限
数字式
chmod 777 test.c
字母式
chmod a+x test.c
给所有的用户加上可执行权限
x w r
chmod +x test.c 没有用户默认就是全部用户
用户
a : 所有的用户
u : 文件所有者
g :同组用户
o :其他用户
硬链接
ln test.c test
软连接
ln -s test.c test
ifconfig
ifconfig ens33 down
ifconfig ens33 up
ifconfig ens33 192.168.111.123
ping www.baidu.com
/etc/init.d/network-manager restart
sudo passwd root
su + 要切换的用户名
time 可执行程序
可以查看可执行程序执行的时间
type 可执行程序
ldd + 可执行程序
tab
int main(int argc,char *argv[])
int argc, 传入的参数的个数
包含自身
char *argv[] 传入的参数
第一个参数是可执行程序本身
查看进程的状态
ps
ps -ef
ps -aux
top
软件的安装和卸载
在线安装
sudo apt-get update 更新软件源
sudo apt-get install vim 在线安装软件
在线卸载
sudo apt-get autoremove vim
离线安装
sudo dpkg -i vim.deb
离线卸载
sudo dpkg -r vim
保存 ctrl + s
退出 crtl + q
比较好用的编辑器
可以远程访问虚拟机里的文件
目前比较流行的编辑器
可以直接编译代码
通用的编辑器 C C++ python lua go
也可以远程链接其他的主机
linux 操作系统的标配
vim 编辑器
命令模式
默认的打开文件进入的就是命令模式
(n)yy:复制 n 行
p:粘贴
(n)dd:删除 n 行
插入模式
i:在光标所在的位置之前插入内容
底行模式
:wq! 强制保存退出
? 要查找的字符串
/ 要查找的字符串
可视模式
在命令模式下输入 v 即可进入到可视模式
头文件包含
宏定义
条件编译
gcc -E
将预处理后的代码转换成汇编语言
gcc -S
将汇编语言转换成二进制的语言
as
链接必要的库
在编译的时候 静态库会被编译进二进制程序
编译完成之后 删除静态库 对程序的执行没有影响
静态库的执行速度较快 比较占空间
以空间换时间
在编译的时候不会被编译进二进制的程序
在程序运行的时候会去指定的目录查找
动态库删除会影响程序的执行
动态库执行会比较耗时
以时间换空间
自动化编译代码的工具
最简单的 makefile 由以下内容组成
目标:依赖
规则
$@:目标
$< : 所有依赖里的第一个
$^: 所有的依赖
在编译代码的时候 要在编译的命令后边加上 -g
如何使用调试工具
gdb ./test
输入 r 运行程序
b 设置断点
cont 继续程序的执行
start 启动按步调试
n 按步调试
s 按步调试
finish 结束循环 结束调试
每个进程在启动的时候都会默认的打开三个标准的文件描述符
0 标准输入 stdin 默认是键盘
1 标准输出 stdout 默认的是显示器
2 标准错误 stderr 默认的是显示器
操作文件的时候 操作的内容不直接写入文件 而是写到内存里
当满足了一定的条件之后 再将内容写入到文件里
FILE *fopen(const char *pathname, const char *mode);
int fclose(FILE *stream);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
int fseek(FILE *stream, long offset, int whence);
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int close(int fd);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
off_t lseek(int fd, off_t offset, int whence);
时间的表示方法
世界标准时间
0 时区的时间 格林威治时间
日历时间
从 1970 年 1 月 1 日 0 时 0 分 0 秒到现在经历的秒数
本地时间
北京时间
时间相关的函数
获取日历时间
time_t time(time_t *tloc);
将日历时间转换成本地时间
struct tm *localtime(const time_t *timep);
目录操作跟之前的缓冲区文件操作类似
打开目录的时候 得到也是一个目录流指针
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
void rewinddir(DIR *dirp);
int mkdir(const char *pathname, mode_t mode);
int rmdir(const char *pathname);
int chdir(const char *path);
不需要打开文件即可获取文件的属性
获取文件的属性的对象如果是链接文件
获取的是链接文件指向的源文件的属性
int stat(const char *pathname, struct stat *statbuf);
需要打开文件才可获取到文件的属性
int fstat(int fd, struct stat *statbuf);
不需要打开文件即可获取文件的属性
当获取文件的属性的对象是链接文件的时候
获取的是链接文件本身的属性
int lstat(const char *pathname, struct stat *statbuf);
文件的属性结构体
struct stat {
ino_t st_ino; 节点号
mode_t st_mode; 文件类型和权限
nlink_t st_nlink; 硬链接的个数
uid_t st_uid; 文件所有者用户 id
gid_t st_gid; 组 id
off_t st_size; 文件的大小
}
mode_t st_mode;
是一个 16 位的一个数
前 4 位 用来表示文件的类型
中间三位 黏住位
后 9 位 对应了文件所有者、同组用户、其他用户的权限
程序 存储在外部存储介质上的可以运行在计算机里的二进制的文件
进程 当程序加载到内存里运行起来之后产生
特殊的进程
0 号进程 引导程序
祖先进程 操作系统启动的第一个进程 1 号进程
孤儿进程 父进程结束了子进程还在运行 会被 init 进程接管
僵尸进程 子进程退出了父进程没有做清理
pid_t getpid(void);
pid_t getppid(void);
pid_t fork(void);
1)fork 创建的子进程会完整的拷贝一份父进程的资源
2)fork 函数创建的子进程从 fork 函数往下运行
3)子进程和父进程的执行的先后顺序不确定 由 CPU 的调度算法决定
4)子进程和父进程的空间相互独立互不干扰
1)vfork 创建的子进程会共享父进程的资源
2)vfork 函数创建的子进程从 vfork 函数往下运行
3)子进程先执行,父进程后执行子进程执行结束要调用 exit 退出执行
4)当子进程调用了 execl 函数之后子进程的空间跟父进程的空间就分开了
pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);
结束进程的执行 会清理缓冲区
void exit(int status);
结束进程的执行 不会清理缓冲区
void _exit(int status);
当一个进程无法为操作系统做贡献,可以调用 execl 函数族对进程进程重生
int execl(const char *pathname, const char *arg, .../* (char *) NULL */);
int execlp(const char *file, const char *arg, ...
/* (char *) NULL */);
当进程快要结束的时候 调用钩子函数的回调函数再去做一件事
int atexit(void (*function)(void));
int system(const char *command);
查看常见的信号 可以使用 kill -l
前 31 个信号
是旧的信号 不稳定 易丢失 不支持排队
后 31 个信号
是新的信号 稳定 不易丢失 支持排队
int kill(pid_t pid, int sig);
int raise(int sig);
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
SIG_DFL 默认
SIG_IGN 忽略
调用信号处理的回调函数
unsigned int alarm(unsigned int seconds);
int pause(void);