LINUX基本命令

LINUX基本命令

命令提示符

lqh@lqh:~$

lqh:用户名

lqh:机器名

~:当前位于家目录

普通用户 /home/ + 用户名

超级管理员用户 /root

$:当前登录的是普通用户

#:表示当前登录的是超级管理员用户

常见的指令

文件操作相关的

查看文件/文件的信息
ls 

ls -ail
切换工作路径

常规用法

cd + 绝对路径/相对路径

特殊用法

cd – 跳转到上次工作的目录

创建目录

创建一个空目录

mkdir mytest

创建一个非空目录/如果存在则跳过不存在则创建

mkdir -p
拷贝

cp 源文件 目标路径/

剪切

mv 源文件 目标路径/

touch

创建一个空文件

当文件不存在的时候新建

文件存在会更新时间戳 但是不会修改文件里的内容

cat

查看文件里的内容

rm

删除文件

-rf 强制删除

删库跑路 rm -rf /(不要轻易尝试)

压缩解压缩

压缩文件

tar cvf 123.tgz test 1.c 2.c

解压缩

tar xvf 123.tgz -C /
chmod

更改文件的权限

数字式

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
修改网卡的 ip
ifconfig ens33 192.168.111.123
查看网络是否通畅
ping www.baidu.com
重启网络

/etc/init.d/network-manager restart

LINUX基本命令_第1张图片

修改密码
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

linux 下的常用的工具

编辑器

常见的编辑器
gedit 类似于 windows 下的记事本

保存 ctrl + s

退出 crtl + q

notepad++

比较好用的编辑器

可以远程访问虚拟机里的文件

vscode

目前比较流行的编辑器

可以直接编译代码

通用的编辑器 C C++ python lua go

也可以远程链接其他的主机

vim 编辑器

linux 操作系统的标配

vim 编辑器

命令模式

默认的打开文件进入的就是命令模式

(n)yy:复制 n 行

p:粘贴

(n)dd:删除 n 行

插入模式

i:在光标所在的位置之前插入内容

底行模式

:wq! 强制保存退出

? 要查找的字符串

/ 要查找的字符串

可视模式

在命令模式下输入 v 即可进入到可视模式

编译器过程

预处理

头文件包含

宏定义

条件编译

gcc -E

编译

将预处理后的代码转换成汇编语言

gcc -S

汇编

将汇编语言转换成二进制的语言

as

链接

链接必要的库

库文件

静态库(.a)

在编译的时候 静态库会被编译进二进制程序

编译完成之后 删除静态库 对程序的执行没有影响

静态库的执行速度较快 比较占空间

以空间换时间

动态库 (.so)

在编译的时候不会被编译进二进制的程序

在程序运行的时候会去指定的目录查找

动态库删除会影响程序的执行

动态库执行会比较耗时

以时间换空间

makefile(了解 cmake)

自动化编译代码的工具

最简单的 makefile 由以下内容组成

目标:依赖

规则

$@:目标

$< : 所有依赖里的第一个

$^: 所有的依赖

gdb 调试工具

在编译代码的时候 要在编译的命令后边加上 -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)子进程和父进程的空间相互独立互不干扰

pid_t vfork(void);

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 函数族

当一个进程无法为操作系统做贡献,可以调用 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));
执行一个 shell 命令
int system(const char *command);

信号

查看常见的信号 可以使用 kill -l

前 31 个信号

是旧的信号 不稳定 易丢失 不支持排队

后 31 个信号

是新的信号 稳定 不易丢失 支持排队

  1. SIGINT ctrl+c
  2. SIGQUIT ctrl+\
  3. SIGKILL 杀死
  4. SIGALRM 时钟信号
  5. SIGCHLD 发送给父进程的信号
  6. SIGCONT 继续进程的执行
  7. SIGSTOP 暂停进程的执行

一个进程发送一个信号到另一个进程(重要)

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);

你可能感兴趣的:(linux,stm32)