一、基础
- Linux 磁盘分区文件名:SATA硬盘为/dev/sd(a-p),虚拟磁盘为/dev/vd(a-p)
- 磁盘分区方式:MBR和GPT,MBR只使用64B来管理磁盘,所以最多只能划分4个主分区或者延伸分区,延伸分区最多只有一个,可以通过延伸分区划分其他的逻辑分区。
- MBR的磁盘挂载之后如果分区,则具体的分区为/dev/sda1往后延伸,如果是延伸出来的虚拟分区则从sda5开始往后,因为1-4为主分区保留
- 开启引导程序:BIOS和UEFI
- stdin: 代码0,使用 < 或者 <<
- stdout:代码为1,使用> 或者 >>,使用 >> 时,若目标文件不存在,则创建,若存在,则追加,使用> 的话则会覆盖
- stderr:代码2,使用2> 或则 2>>
- defunct表示僵尸进程
- 进程终止的方式:1、调用exit系统调用,请求退出。2、其他线程发出信号,将进程杀死。无论何种方式退出,进程都会生成一个非负的小整数,表示当前的状态,供父进程调用wait系统调用检测。
- 信号从产生直至送达进程期间,一直处于挂起状态。通常,系统会在接收进程下次获得调度时,将处于挂起状态的信号同时送达。如果接收进程正在运行,则会立即将信号送达。然而,程序可以将信号纳入所谓“信号屏蔽”以求阻塞该信号。如果产生的信号处于“信号屏蔽”之列,那么此信号将一直保持挂起状态,直至解除对该信号的阻塞。
- 每个进程持有一份环境列表,以KV形式存储,子进程继承父进程的,可以通过exec系统调用替换当前运行的程序时,当前进程可以选择使用老环境或者在exec的参数中指定新环境。(大多数shell可以使用export命令来创建环境变量)
- 会话指一组进程组,会话中的所有进程都具有相同的会话标识符,会话首进程是指创建会话的进程,其进程ID为会话ID。通常会话会与某个控制终端相关,由交互式Shell创建的会话,便是用户的登录终端。会话总有一个前台进程组(接收输入、输出),同时可以拥有任意个后台进程组。
二、基本命令
- date:显示当前日期
- cal:显示日历
- bc:打开计算器
- shutdown:关机
- chmod:更改文件权限,R为4,W为2,X为1,7表示拥有RWX权限、6表示拥有RW权限,chmod 777 表示文件所有者、群组、其他人都拥有RWX权限
- touch:创建文件
- less、more、cat、tac:查看文件
- mkdir、rmdir:创建目录、目录具有X权限才能cd进入
- file:查看文件类型
- whereis、locate、find:查找文件、find不常用,效率很低
- df:列出文件系统的整体磁盘使用量
- du:评估文件系统的磁盘使用量
- ln:创建文件链接,不加参数为硬连接,加参数-s表示软链接
- lsblk:列出系统上的所有磁盘列表
- blkid:列出系统的所有磁盘设备名字以及其UUID和type
- parted:列出某个设备的详细分区信息
- fdisk:以MBR分区表来对磁盘进行分区
- gdisk:以DPT分区表来对磁盘进行分区
- mkfs:对磁盘进行格式化,例如mkfs.xfs以xfs格式化某个磁盘
- xfs-repair、fsck.ext4:对文件系统进行修复
- gzip\zcat:使用gzip对文件进行压缩
- bzip2、bzcat:使用bzip2进行压缩
- xz、zcat:使用xz进行压缩
- env:查询当前的环境变量
- set:查询环境变量和自定义变量
- export:自定义变量转环境变量
- declare:将环境变量转自定义变量
- read:读取键盘输入
- ulimit:针对用户进行资源限制,例如内存占用量、cpu使用时间等
- alias、unalias:给命令起别名,取消给命令起的别名, alias不加参数为展示当前所有起了别名的命令
- history:查看历史命令,如果同一个用户开启了多个bash,则只有最后一个bash执行的命令会被记录,前面的bash的历史命令会被覆盖
- cut:截取信息
- grep:分析一行数据,提取出我们想要的
- tee:双向重导向
- awk:文件处理
- bg:将一个stop的后台任务,从stop状态变为running
- fg:将一个stop的后台任务提取到前台来执行 (可以使用ctrl + z 将任务暂停)
- nohup:ctrl + z 暂停的任务只是和终端机(tty,terminal的一种)绑定,这样我们关掉terminal后,该任务就会被终端,nohup则是让任务可以在关闭tty的时候不会终端,继续运行
- ps:查看进程某个时间点的数据,可以加参数 a 排除所有与terminal有关的process,加参数u过滤与有效使用者无关的process,加参数x列出较详细的信息,即ps aux 可以查看系统所有运行的进程,ps -l查看与自己bash进程相关的进程信息
- top:动态观察进程的变化
- pstree:查看进程树
- kill -signal pid:向进程发送信号,默认为15,signal后加1,为SIGHUP启动一个被终止的进程,2为SIGINT,中断进程,9为SIGKILL,强制关闭一个进程,15为SIGTERM,正常关闭一个进程,19为SIGSTOP,暂停一个进程
- free:观察内存使用情况
- uname:查阅系统与核心相关信息
- uptime:系统启动时间与工作负载
- netstat:网络信息
- dmesg:抓取内核所产生的日志信息
- vmstat:观察系统资源的变化
- fuser:通过文件名找到正在使用该文件的进程
- lsof:列出被进程所开启的文件名
- pidof:得到某个进程的pid
- systemctl:管理服务(即后台程序),格式 systemctl [command] [服务名]
- lsmod:查看系统当前加载的模块
三、快捷键
- ctrl + d:键盘输入结束
- ctrl + c:终止目前的命令
- ctrl + m:enter
- ctrl + s:暂停屏幕的输出
- ctrl + q:恢复屏幕输出
- ctrl + u:在提示字符下,将整列命令删除
- ctrl + z:暂停目前的命令
- shift + page up / page down:翻页
四、API
4.1 文件I/O
- open: fd = open(pathname,flags,mode),flags为标志位,可以设置为只读、只写、读写、文件不存在创建等,mode指定文件的访问权限。如果调用open成功,则保证其返回值为进程未使用文件描述符中数值最小者
- read:readNum = read(fd,buffer,count)从fd所表示的文件中读取最多count个字节的数据到buffer
- write:writeNum = write(fd,buffer,count)从buffer中读取count个字节的数据写入fd所表示的文件中
- pread:多增加第四个参数表示偏移量,基于给定的offset进行读取操作,而非当前的文件偏移量,多线程情况下共享文件偏移量,使用此调用不会对其他线程造成影响
- pwrite:同read
- close: status = close(fd),关闭文件释放相应的资源
- fcntl:int fcntl(int fd,int cmd, …):cmd有多种,对应不同的操作,…对应操作的参数
- F_GETFL:获取文件的访问模式及状态标志,即open的flags参数,此操作不需要参数
- F_SETFL: 修改文件的访问模式及状态标志
- F_UPFD: 复制文件fd,功能类似于dup系统调用
- 当一个文件不是由调用程序通过open打开时,flags可以通过fcntl来进行修改
- dup:int dup(int oldfd),复制一个打开的文件描述符,并返回一个新的,两者指向同一个打开的文件
- readv:分散输入,从文件描述符fd所指代的文件中读取一片连续的字节,然后将其散置(“分散放置”)于iov指定的缓冲区中。
- writev: 集中输出,将iov所指定的所有缓冲区中的数据拼接(“集中”)起来,然后以连续的字节序列写入文件描述符fd指代的文件中。
- truncate、ftruncate:将文件大小设置为length参数指定的值
- mkstemp:创建一个临时文件,拥有唯一的文件名,并返回一个fd
- tmpfile:创建一个名称唯一的临时文件,并以读写方式将其打开。tmpfile()函数执行成功,将返回一个文件流供stdio库函数使用。文件流关闭后将自动删除临时文件。为达到这一目的,tmpfile()函数会在打开文件后,从内部立即调用unlink()来删除该文件名
Bash
-
为变量添加内容:eg: PATH=${PATH}:内容
-
变量的值为命令执行的结果: eg:version=$(uname -r)
-
变量要删除内容可以使用 # 关键字,eg:echo ${PATH#/*bin/bash},从左开始删除可以匹配 /*bin/bash的最短字符串,如果将#改为##,则删除最长的
-
将#改为%,则从后向前删除
-
将#改为/,则是进行替换,此时参数为两个,即 $ {变量名/就字符串/新字符串}、${变量名//就字符串//新字符串}
-
shell分为login shell和 non-login shell,login shell进入后一般会读取/etc/profile文件和~/.bash_profile或者 ~/.bash_login或者 ~/.profile(三者只读其一)
-
/etc/profile主要设置的变量有:PATH、MAIL、USER、HOSTNAME、HISTSIZE、umask
Gcc
- fPIC:gcc -fPIC xxx.c,该参数用于编译阶段,告知编译器产生与位置无关的代码,使得产生的.o文件中全部为相对地址,不包含绝对地址(共享库一般要求可以被加载到任意地方),如果不加该参数,产生的动态库每次加载都需要重新定位,因此会产生重定位后的代码拷贝,失去共享一份代码的作用。