linux 系统

 

系统指令

内存指令

top

graph LR;
    X(说明)
    X-->B(PID)-->B1(进程标识符)
    X-->C(USER)-->C1(进程所有者)
    X-->D(PR)-->D1(进程优先级别, 越小越优先被执行 )
    X-->E(NI)-->E1(进程Nice值, 代表这个进程优先值)
    X-->F(VIRT)-->F1(进程占用虚拟内存)
    X-->G(RES)-->G1(进程占用物理内存)
    X-->H(S)-->H1(进程状态, S表示休眠, R表示正在运行, Z表示僵死状态)
    X-->I(%CPU)-->I1(进程占用CPU百分比)
    X-->J(%MEM)-->J1(进程使用物理内存和总内存百分比)
    X-->K(TIME+)-->K1(进程启动后占用总CPU时间)
    X-->L(COMMAND)-->L1(启动该进程命令名称)

free

free 参数
参数 含义
用KB为单位展示数据
-m 用MB为单位展示数据
-g 用GB为单位展示数据

结果 含义
total 总计物理内存大小
used 已使用内存大小
free 可用内存大小
shared 多个进程共享内存总额
buff/cache 磁盘缓存大小
available 可用内存大小
清理内存
sudo sh -c "echo 参数 > /proc/sys/vm/drop_caches"
参数 含义
0 系统默认值, 表示不释放内存, 由OS自动管理
1 释放页缓存
2 释放dentries和inodes
3 释放所有缓存
  • 示例, 释放所有缓存
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"

进程指令

ps

ps -aux
graph LR;
    X(参数)
    X-->A(a)-->A1(显示所有进程)
    X-->B(x)-->B1(同时显示没有控制终端进程)
    X-->C(u)-->C1(使用基于用户信息输出格式)

查看指定进程pid
ps -aux | grep 进程名

其中带中括号命令(如 [kthreadd])并不是真正命令而是内核线程

查看指定端口
ps -ef | grep 端口号

lsof

根据端口号查询进程信息

lsof -i:端口号
  • 示例, 查看8000端口进程

graph LR;
    X(参数)
    X-->A(COMMAND)-->A1(进程名称)
    X-->B(PID)-->B1(进程标识符)
    X-->C(USER)-->C1(进程所有者)
    X-->D(FD)-->D1(文件描述符)
    X-->E(TYPE)-->E1(文件类型, 如DIR、REG)
    X-->F(DEVICE)-->F1(指定磁盘名称)
    X-->G(SIZE)-->G1(文件大小)
    X-->H(NODE)-->H1(索引节点)
    X-->I(NAME)-->I1(打开文件确切名称)

nohup

no hang up(不挂起), 用于在系统后台不挂断地运行命令, 退出终端不会影响程序运行

默认情况(非重定向)时, 会输出nohup.out到当前目录, 若当前目录nohup.out文件不可写, 则输出重定向到${HOME}/nohup.out文件

nohup command [arg...] &
参数 含义
command 要执行命令
arg 一些参数, 可以指定输出文件
& 让命令在后台或终端退出后仍执行
  • 示例, 后台运行python

网络命令

查看

ifconfig

启动

ip link set 网卡名 up

关闭

ip link set 网卡名 down

获取IP

dhclient

用户指令

查看用户

cat /etc/passwd
  • 示例, 输出登录、未关闭用户信息
cat /etc/passwd | grep -v nologin | grep -v halt | grep -v shutdown | awk -F":" '{ print $1"|"$3"|"$4 }'|more

查看组

cat /etc/group

新建用户

sudo adduser 用户名

sudo passwd 用户名

修改主机名

# 编辑/etc/hostname文件
新主机名

重启

系统调用

IO

write

write把缓冲区buf前nbytes个字节写入到与文件描述符fd关联文件中, 返回实际写入字节数

size_t write(int fildes, const void *buf, size_t nbytes)
状态 返回值
正常写入 实际写入字节数
未写入数据 0
调用错误 -1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
	const size_t WRITE_INFO_LEN = 18;
    const size_t ERR_INFO_LEN   = 46;
    const char* WEITE_INFO = "Here is some data\n";
    const char* ERR_INFO   = "A write error has occurred on file descriptor 1 \n";
    // 向fd1(屏幕)写入
    if (write(STDOUT_FILENO, WEITE_INFO, WRITE_INFO_LEN) != WRITE_INFO_LEN) {
        write(STDERR_FILENO, ERR_INFO, ERR_INFO_LEN);
    }
    return 0;
}

read

#include<unistd.h>

size_t read(int fildes, void *buf, size_t nbytes)

从文件描述符fildes相关联文件里读入nbytes个字节数据, 并放到数据区buf中

情况 返回值
正常写入 实际读入字节数
未读入数据, 已经到达文件尾 0
调用错误 -1
  • 示例, 读取键盘输入显示在屏幕
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
	const int READ_INFO_LEN      = 128;
	const int READ_ERR_INFO_LEN  = 26;
	const int WRITE_ERR_INFO_LEN = 27;
    char buffer[READ_INFO_LEN];

    // 从fd0(键盘)中读入
    int readRes = read(STDIN_FILENO, buffer, READ_INFO_LEN);
    if (readRes == -1) {
        write(STDERR_FILENO, "A read error has occurred\n", READ_ERR_INFO_LEN);
    }
    // 向fd1(屏幕)写入
    int writeRes = write(STDOUT_FILENO, buffer, readRes);
    if (writeRes != readRes) {
        write(STDERR_FILENO, "A write error has occurred\n", WRITE_ERR_INFO_LEN);
    }
    return 0;
}

open

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode);

创建新文件描述符, 调用成功后返回可以被read, write和其他系统调用那个所使用文件描述符

graph LR;
    X(oflags参数)
    X-->A(O_RDONLY)-->A1(只读方式打开)
    X-->B(O_WRONLY)-->B1(只写方式打开)
    X-->C(O_RDWR)-->C1(读写方式打开)
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main(void) {
    char block[1024];
    int nread;

    int in  = open("file.in", O_RDONLY);
    int out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
    while((nread = read(in, block, sizeof(block))) > 0) {
        write(out, block, nread);
    }
    return 0;
}

FILE

#ifndef _FILE_DEFINED
struct _iobuf {
    // 文件输入下一个位置
    char *_ptr;
    // 当前缓冲区相对位置
    int _cnt;
    // 文件起始位置
    char *_base;
    // 文件标志
    int _flag;
    // 文件描述符id
    int _file;
    // 检查缓冲区状况,若无缓冲区则不读取
    int _charbuf;
    // 文件缓冲区大小
    int _bufsiz;
    // 临时文件名
    char *_tmpfname;
};

typedef struct _iobuf FILE;

#define _FILE_DEFINED
#endif

FILE结构是间接地操作系统文件控制块(FCB)来实现对文件操作

接口

fopen
// 读文件到内存,返回文件信息结构指针
FILE *fopen(char *file, char *open_mode)

信号是软件中断, 提供一种处理异步事件方法

信号

void (*signal (int sig, void (*func)(int)))(int);

signal(registered signal, signal handler)

第一个参数是一个整数, 代表了信号编号

第二个参数是一个指向信号处理函数指针

// signal.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

static void sig_usr(int signo) {
    if(signo == SIGUSR1) {
        printf("received SIGUSER1\n");
    } else if (signo == SIGUSR2) {
        printf("received SIGUSER2\n");
    } else {
        printf("received signal %d\n", signo);
    }
}

int main(int argv, char *argc[]) {
    if (signal(SIGUSR1, sig_usr) == SIG_ERR) {
        perror("can't catch SIGUSR1");
    }
    if (signal(SIGUSR2, sig_usr) == SIG_ERR) {
        perror("can't catch SIGUSR2");
    }
    for(;;) {
        pause();
    }
    return 0;
}

raise

int raise (signal sig);

sig 是要发送信号编号, 信号包括:

SIGINT, SIGABRT, SIGFPE, IGILL, SIGSEGV, SIGTERM, SIGHUP

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
 
void signalHandler(int signum){
    printf("interrupt signal %d received\n", signum);
    // 清理并关闭
    exit(signum);
 

int main(void){
    // 注册信号 SIGINT 和信号处理程序
    signal(SIGINT, signalHandler);
 
    for(int i = 0; i < 5; i++){
        printf("going to sleep...\n");
        if(i == 3){
           raise(SIGINT);
        }
        sleep(1);
    }
    return 0;
}

系统结构

系统启动

/boot

存放启动linux一些核心文件, 包括连接文件及镜像文件

/lib

lib(library)库, 存放着系统最基本动态连接共享库, 作用类似于 windows 里 dll

/sys

linux2.6 内核中新出现文件系统sysfs就安装于该目录下

sysfs 文件系统集成, 针对进程信息proc 文件系统、针对设备devfs 文件系统以及针对伪终端devpts 文件系统信息

该文件系统直观反映内核设备树, 当一个内核对象被创建候, 对应文件和目录也在内核对象子系统中被创建

指令合集

/bin

bin(Binaries)二进制文件, 存放着最常使用命令

/sbin

Superuser Binaries (超级用户二进制文件), 存放系统管理员所使用系统管理程序

外部文件管理

/etc

存放所有系统管理所需配置文件和子目录

/dev

dev(Device)设备, 存放linux外部设备, 访问设备与访问文件方式相同

/media

该目录用于挂载识别设备(如U盘、光驱)

/mnt

该目录用于临时挂载其他文件系统

临时文件

/run

临时文件系统, 存储系统启动以来信息, 当系统重启时, 该目录下文件应该被删掉或清除

/lost+found

一般情况下为空, 系统非法关机后, 这里将生成文件

/tmp

tmp(temporary)存放临时文件

账户

/root

该目录为系统管理(超级权限者)用户主目录

/home

用户主目录, 每个用户都有一个

/usr

usr(unix shared resources), 用户很多应用程序和文件都放在这个目录下, 类似于 Windows program files 目录

子目录 作用
/usr/bin 系统用户所使用应用程序
/usr/sbin 超级用户所使用管理程序和系统守护程序
/usr/src 内核源代码默认放置目录

运行过程中使用

/var

var(variable), 存放常修改数据, 如日志(var/log)

/proc

proc(Processes), /proc 是虚拟文件系统, 存储当前内核运行状态等一系列特殊文件, 是系统内存映射, 内容在内存里, 可通过直接访问此目录来获取系统信息

拓展

/opt

该目录用于给主机额外安装软件

/srv

该目录存放一些服务启动之后需要被提取数据