# Linux 使用

comming soon... 本文正在筹备中

# Linux 基本操作

  • man man
  • gcc

# 软件安装

  • 手动安装软件
  • PATH 环境变量
  • 编译软件源码
  • 使用软件管理工具:

# 信号 (Signal)

Linux 下通过 kill 命令给进程发送信号或关闭进程。

执行 man kill 可以看这个命令的用法。

NAME
     kill -- terminate or signal a process

SYNOPSIS
     kill [-s signal_name] pid ...
     kill -l [exit_status]
     kill -signal_name pid ...
     kill -signal_number pid ...

EXAMPLES
     Terminate the processes with PIDs 142 and 157:

           kill 142 157

     Send the hangup signal (SIGHUP) to the process with PID 507:

           kill -s HUP 507

# Signal 的产生

  • 在终端输入某些组合键的时候,会给进程发送信号,例如,Ctrl+C 产生 SIGINT 信号,Ctrl+Z 产生 SIGTSTP 信号
  • 硬件异常也会产生信号。比如,执行了除以 0 的指令,CPU 会产生异常,然后把 SIGFPE 信号发送给进程。再如,访问了非法内存,内存管理模块就会产生异常,然后把信号 SIGSEGV 发送给进程

# SIGFPE

C 语言除零的结果是未知的,所以说 C 语言不安全,如果程序员写代码不小心除了 0,那后果是不可控的。

后来的语言: Java、Python 在除零的时候直接抛异常。也有一些语言,如 JavaScript,除零的结果是无穷大。

#include <stdio.h>
int main() {
    int a = 1 / 0;
    printf("%d\n", a);
    return 0;
}

# SIGSEGV

#include <stdio.h>
int main() {
    int *a;
    a = 0;
    printf("%d\n", *a);
    return 0;
}

# Signal 的种类

Linux 下敲: man 7 signal,或者谷歌搜 「linux signal man 7」。

小作业

之前我们接触过了 SIGFPE 和 SIGSEGV 这两个 Signal,请查阅文档,回答以下问题:

  • SIGFPE 是哪些单词的缩写?
  • SIGSEGV 表示出了什么错?
  • SIGSEGV 是哪些单词的缩写?这个问题可能在文档中找不到答案。

# 管道 (Pipe)

在 Linux 下我们常用“竖线”把两个命令连起来,这个“竖线”就是一种匿名管道 (Anonymous Pipes)。管道这个词非常形象,它有两个端口,一端用于读取,另一端用于写入。