Black Mamba

Faster, Higher, Stronger.

Install and Run Hello World by Qt

  • 下载 Qt-4.5.3 版本, 先读 README 文档, 得知 Qt 的安装方法在 INSTALL 文档中, 按照 INSTALL 文档中的步骤来安装
  • ./configure, 如果这一步出错, 原因可能是没有安装 g++, 解决方案
    • ubuntu: apt-get install g++
    • CentOS: yum install gcc-c++.x86_64
  • ./configure, 如果这一步还出错, 遇到了安装 Qt 时的经典错误 Basic xLib functionality test failed! 这说明需要安装 libx11 的开发包
    • 在 Ubuntu 下, 安装命令为:
      • sudo apt-get install libx11-dev libxext-dev libxtst-dev
    • 在 CentOS下, 安装命令为:
      • yum install libx11-devel libxext-devel libxtst-devel
  • 下面开始 make, 时间比较长
  • 下面开始 make install 进行安装, 安装到了 /usr/local/Trolltech/Qt-4.5.3/bin 目录下
  • 运行 ./designer 如果看到 Qt 正常启动, 说明安装成功

  • 接下来, 在 Qt 的源码目录中新建环境设置脚本 setenv.sh,设置环境变量, 内容如下: QTEDIR=/usr/local/Trolltech/Qt-4.5.3 PATH=\$QTEDIR/bin:\$PATH LD_LIBRARY_PATH=\$QTEDIR/lib:$LD_LIBRARY_PATH
  • 再执行 source setenv.sh, 使环境变量生较
  • 设置好之后通过执行下面命令查看是否生效 qmake -v which qmake
    • 显示的 qmake 版本和路径应该与安装的版本和路径是相同的, 则输出成功

  • 接下来, 新建一个文件夹并编写一个 hello.cpp 应用程序
  • vim hello.c

#include < QApplication> #include < QLabel> int main(int argc, char argv[]) { QApplication app(argc, argv); QLabel label = new QLabel(“hello world!”); label->show(); return app.exec(); }

  • 接下来, 在 hello.cpp 所在文件夹中执行
    • qmake -project, 生成 hello.pro
    • qmake hello.pro, 生成 Makefile
    • make, 生成 hello 和 hello.o 两个文件
    • 双击运行 hello 或 运行 ./hello 即可弹出文本框

Shell Notes I

  • 替我们工作的是 “硬件”, 控制硬件的是 “核心”. 用户是通过 “Shell” 控制一些内核提供的 “工具(Utility)”, 来控制硬件工作
  • Shell(壳) 是连接人类和 kernel(核心, 使计算机主机工作) 的桥梁
  • 命令别名设置功能
  • alias lm=‘ls -al’, 将 lm 命令设置为 ‘ls -al’, 即显示目录中所有的内容
  • alias l=‘ls -F’, 将 l 命令设置为 ‘ls -F’, 即以文件类型格式来显示目录中的内容
  • unalias lm, 取消 lm 命令的别名

  • type 命令查看命令类型

  • type ls

    查询 ls 是否为 shell 内置命令 ls is aliased to `ls –color=auto’

  • type -a ls

    查询 ls 命令的最主要使用情况 ls is aliased to `ls –color=auto’ ls is /bin/ls

  • type cd

    cd is a shell builtin

  • 变量设置中的单引号与双引号的不同, 双引号可以保持变量的内容, 单引号只能是一般字符

  • [root@linux ~]# name=“$name”

  • [root@linux ~]# echo $name Ngcl

  • [root@linux ~]# name=‘$name’

  • [root@linux ~]# echo $name

$name

  • 在执行命令时, 引号 (`) 代表的含义
  • 在一串命令中, ` 之内的命令先被执行, 而其执行出来的结果将作为外部输入信息
  • 例如, locate 命令可列出所有相关文件的文件名, 如想知道每个文件的权限, 应先用 locate 将文件名数据列出来, 再用 ls 命令来处理
  • [root@linux ~]# ls -l `locate crontab`

  • 变量键盘读取

  • read [-pt] variable
  • -p: 后接提示符
  • -t: 后接时间
  • 例1:
  • [root@linux ~]# read atest This is a test
  • [root@linux ~]# echo $atest This is a test $name
  • 例2:
  • [root@linux ~]# read -p “Please keyin your name: ” -t 30 named Please keyin your name: Ngcl
  • [root@linux ~]# echo named Ngcl

  • 历史命令: history

    • !66, 执行第 66 条命令
    • !!, 执行上一条命令
    • !al, 执行最近的以 al 开头的命令
  • Shell 配置文件: ~/.bashrc

    • User specific aliases and functions

      添加用户自己设定的 alias 变量别名

    • 使用 source 或小数点 (.), 将设置文件的内容读进当前的 shell 环境中
    • source ~/.bashrc
    • . ~/.bashrc
  • 数据流重导向

    • 输入 (stdin): 代码为 0, 使用 < 或 <<
    • 输出 (stdout): 代码为 1, 使用 > 或 >> 或 1>
    • 标准错误输出 (stderr): 代码为2, 使用 2> 或 2>>
    • 例如:
    • 将当前目录下的文件信息全存储到 list.txt (覆盖写) ls -al > list.txt
    • 将根目录下的数据也存储到 list.txt (添加写) ls -al / >> list.txt
  • 正则表达式

    • grep ‘root’ ~/list.txt 查找 list.txt 中有 ‘root’ 的那一行
    • grep -v ‘root’ ~/list.txt, (v: invert) 查找 list.txt 中没有 ‘root’ 的那一行
    • grep -n ‘a’ list.txt, (n: show line number) 查找 list.txt 中有 ‘a’ 的行, 并显示行号
  • Shell 脚本即剧本, 即用 shell 功能所编写的 “程序(program)”, 可以类比为 DOS 中的批处理文件 (.bat), 最简单的功能是将许多命令写在一起, 让用户很轻松地就能执行一次执行多个命令

    • 可以看为一种程序语言, 且这个程序语言用 shell 相关工具命令, 所以不需要编译即可执行, 还拥有不错的调试 (debug) 工具

    • Shell 版本 “Hello World!”

#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo -e “Hello World ! \a \n” read -p “Enter first name and last name” firstname lastname echo -e “\nFull name: \$firstname \$lastname” exit 0

  • 解释:
  • 第 1 行: #!/bin/bash 在声明这个脚本使用的 shell 名称和使用的 bash 的语法, 没有这一行, 该程序可能无法运行, 因为系统无法判断使用什么 shell 来执行
  • PATH 用来设置好环境变量, 可让程序直接进行并执行命令, 而不必写绝对路径

  • 执行该脚本:

    • sh hello.sh
    • chmod a+x hello.sh ./hello.sh
  • read -p

    • 后根一个字符串 “”, 字符串 “some string” 后可以跟多个变量作输入
  • echo -e

    • 参数前加 \$ 符号,\$firstname
  • 判断文件类型与属性

    • test -f, filetype=“regulare file”
    • test -d, filetype=“directory”
    • test -r, permission=“readable”
    • test -w, permission=“\permission writable”
    • test -x, permission=“\permission executable”
  • netstat -tuln 指令, 可查询到目前主机开启的网络服务端端口, 取得目前主机启动的服务

    • 常见的 port 与相关网络服务的关系:
    • 80: www
    • 22: ssh
    • 21: ftp
    • 25: mail
  • testing=netstat -tuln | grep ":80 " if [ “$testing” != “” ]; then echo “WWW is sunning” fi

testing=netstat -tuln | grep ":22 " if [ “$testing” != “” ]; then echo “SSH is sunning” fi

testing=netstat -tuln | grep ":21 " if [ “$testing” != “” ]; then echo “FTP is sunning” fi

testing=netstat -tuln | grep ":25 " if [ “$testing” != “” ]; then echo “Mail is sunning” fi

  • if [ “\$yn” == “Y” ] || [ “\$yn” == “y” ]; then echo “OK, continue” elif [ “\$yn” == “N” ] || [ “\$yn” == “n” ]; then echo “Oh, interrupt!” else echo “I don’t know what is your choise” fi

  • read -p “Please input (Y/N): ” yn [ “\$yn” == “Y” -o “\$yn” == “y” ] && echo “OK, continue” && exit 0 [ “\$yn” == “N” -o “\$yn” == “n” ] && echo “OK, interrupt!” && exit 0 echo “I don’t know what is your choise” && exit 0

  • if [ “\$yn” == “Y” ] || [ “\$yn” == “y” ]; then echo “OK, continue” exit 0 fi if [ “\$yn” == “N” ] || [ “\$yn” == “n” ]; then echo “Oh, interrupt” exit 0 fi echo “I don’t know what is your choise” && exit 0

  • if [ “\$1” == “hello” ]; then echo “Hello, how are you ?” elif [ “\$1” == “” ]; then echo “You MUST input parameters, ex> $0 someword” else echo “The only parameter is ‘hello’” fi

  • case \$1 in “hello”) echo “Hello, how are you ?” ;; “”) echo “You MUST input params, ex> $0 someword” ;; *) echo “Usage \$0 {hello}” ;; esac

  • 算术比较类:

    • exp1 –eq exp2 相等, 为真
    • exp1 –ne exp2 不等,为真
    • exp1 –gt exp2 大于,为真
    • exp1 –ge exp2 大于或等于,为真
    • exp1 –lt exp2 小于,为真
    • exp1 –le exp2 小于或等于,为真
    • !exp 表达式为假,则结果为真
  • until [ “\$yn” == “yes” ] || [ “$yn” == “YES” ] do read -p “Input YES/yes to stop this program: ” yn done

  • s=0 i=0

while [ “\$i” != 100 ] do i=\$((\$i+1)) s=\$((\$s+\$i)) done echo “The res is ==> $s”

s=0 for (( i=1; i<=100; i=i+1 )) do s=\$((\$s+$i)) done echo “The result is ==> \$s”

  • for animal in dog cat elephant do echo “There are ”“$animal”“s…. ” done

Linux Note III

  • 查询一个包是否被安装

    • rpm -q | grep < rpm package name>
  • 列出所有被安装的 rpm package

    • rpm -qa | grep

  • 隐藏/显示 隐藏文件: Ctrl + h

    • 硬盘数据分为两个区域
    • 主引导分区 (MBR, Master Boot Recorder): 放置这个硬盘的信息区,只有 4 个分区记录,这些记录被称为主分区和扩展分区(Extended)。一个磁盘最多可有 4 个(主 + 扩展)分区。其中,扩展分区只能有一个
    • 引导程序 磁盘分区表,分区即修改磁盘 MBR 里的分区表
  • 数据放置区, 实际文件数据放置的地方

    • 如分区超过 4 个,一定要有扩展分区,且必须将所有剩下的空间分给扩展分区,然后再以逻辑分区来规划扩展分区的空间
  • 关机 shutdown

    • shutdown -h now, 立刻关机
    • shutdown -h 20:30, 定时关机
    • shutdown -h +10, 10分钟后关机
    • shutdown -r now, 立刻重启
    • shutdown -r +30 ‘The system will reboot’, 再过30分钟系统会重新启动,并显示后面的信息
  • Linux 文件属性

    • -rwxrwx—, 一个文件有 10 个属性
    • 第一个属性表示这个文件是”目录, 文件或连接文件等”:
  • [d], 目录
  • [-], 文件
  • [l], 连接文件 (link file)
  • [d], 设备文件中可供存储的接口设备
  • [c], 设备文件中的串行端口设备

    • 例1, drwxr–r–, 这时非 root 账号不可以进入该目录, 因为 x 与目录的关系相关重要, 如果在该目录下不能执行命令的话, 那么自然也就无法进入了. 因此, 如对他人开放某个目录, 记得开放该目录的 x 属性
    • 例2, -rw-r–r– 1 root root
      • 拥有者为 root, 用户组为 root,只有 root 才有访问权
    • 例3, -rwxr-xr– 1 test1 testgroup
      • 拥有者为 test1, 用户组为 testgroup, test1 对此文件具有可读, 可写, 可执行的权力; 而同组其他用户可读, 可执行, 但不能写; 非 testgroup 用户组的人则仅可读, 不能写, 不能执行
    • 例4, -rwxr-xr– 1 test1 testgroup
      • 拥有者 test1 可在本目录中进行任何操作, testgroup 用户组的账号可以进入本目录进行操作, 但不能在本目录下写入; 其他权限虽然有 r, 但由于没有 x 权限, 因此不能进入此目录, x 与能否进入该目录有关
    • w 可以让用户删除, 更新, 新建文件或目录
      • 更改文件权限, 当复制文件的时候使用
      • chgrp: 改变文件所属于用户组
      • chown: 改变文件所有者
      • chmod: 改变文件的属性, 可使用数字或符号
      • 当以 vi 编辑 shell 的文字后, 属性通常是 -rw-rw-rw-, 也就是 666, 如要将它变成可执行文件, 并不能让其他人修改此文件, 那么就需要 -rwxr-xr-x 这个 755 的属性, 使用 chmod 755 filename 命令
  • 套接字 (sockets)

    • 通常用在网络数据连接. 可以启动一个程序监听客户端的要求, 客户段就可以通过套接字来进行数据通信
  • cd -, 返回前一个工作目录

  • cd ~account, 返回 account 用户的家目录

  • [root@linux tmp]# cp -i ~/.bashrc bashhh, 将家目录下的 .bashrc 复制到 /tmp下, 并重命名为 bashhh

  • 修改文件时间与创建新文件 touch

    • touch -t 0507150202 bashrc
    • 将 bashrc 日期修改为 2005/07/15 2:02
  • 文件权限掩码 umask

    • 普通用户为 002, root 用户为 022
    • “文件” 默认 “没有 x 权限”, 只有 rw (666) -rw-rw-rw-
    • “目录” 中的 x 与是否可进入此目录有关, 因此默认开放所有权限, 即 rwx (777)
    • -rw-rw-rw-
    • umask -S u=rwx,g=rx,o=rx
    • 例如, umask 为 022, 当用户建立文件和目录时:
    • 建立文件: (-rw-rw-rw-) - (—–w–w-) = (-rw-r–r–)
    • 建立目录: (drwxrwxrwx) - (—–w–w-) = (drwxr-xr-x)
  • 搜索文件

    • 例如: 查找 client.c
    • locate client.c
  • 磁盘与目录的可用容量

    • df -h
    • df -h /etc

Linux Notes IV

Linux 启动过程:

  • 加载 BIOS 的硬件信息, 并获取第一个启动设备代号
  • 读取第一个启动设备的 MBR 引导加载程序 (如 lilo, grub)
  • 加载核心操作系统的核心信息, 核心开始解压缩, 并且尝试驱动所有硬件设备
  • 核心执行 init 程序并获取运行信息
  • init 执行 /etc/rc.d/rc.sysinit 文件
  • 启动核心的外挂模块 (/etc/modprobe.conf)
  • init 执行运行的各个批处理文件 (Scripts)
  • init 执行 /etc/rc.d/rc.local 文件
  • 执行 /bin/login 程序, 等待用户登录
  • 登录之后开始以 Shell 控制主机

引导加载程序 Grub:

  • 引导加载程序是载入核心的工具
  • 将引导加载程序分为两个阶段 (stage) 来执行
    • 第一阶段为引导加载程序的主程序, 这个主程序必须要安装在启动区, 即 MBR 或超级块
    • 第二阶段为载入引导加载程序的所有设置文件与相关的环境参数文件, 都在 /root 下面
  • 针对启动项目, 引导加载程序可以做到:
    • 引导加载程序可以直接指定并取用核心文件, 加载到主存储器中
    • 也可以将加载程序的控制权移交给下一个加载程序
  • MBR 的 grub 可以做到:
    • 直接指定核心 (boot/vmlinux) 来进行启动
    • 将控制权交给 /dev/hda2 超级块中的 grub 进行管理

Grub 的设置文件 /boot/grub/menu.1st 与安装类型:

  • Grub 启动时可自行编辑与修改启动设置项目, 类似 bash 的命令模式
  • 可以动态搜索设置文件, 而不需要在修改设置文件后重新安装 grub, 即只要修改完 /boot/grub/menu.1st 里的设置, 下次启动就生效了
  • Grub 与硬盘的关系
    • grub 对硬盘的代号: (hd0, 0)
    • 硬盘代号以小括号 () 括起来
    • 硬盘以 hd 表示, 后面接一组数字
    • 第一个搜索到的硬盘为 0 号, 第二个为 1 号,以此类推
    • 第一个硬盘的第一个分区代号为 0, 以此类推

Install Arm-linux-gcc on Linux

  • 下载 arm-linux-gcc-4.3.2.tg 包并解压到 /usr/local/ 目录下

  • 配置 /etc/profile 全局环境变量, 在文件末尾加上:

    • export PATH=$PATH:/usr/local/arm/4.3.2/bin

    • source /etc/profile

  • 配置成功后在命令行输入 arm-linux-gcc -v 命令查看版本信息

Ubuntu Install Software and Its Solution

When install a software, sometimes the following error will occur:

  • E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
  • E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

This is the solution:

  • sudo rm /var/cache/apt/archives/lock
  • sudo rm /var/lib/dpkg/lock

Make Menuconfig Error and Solving Method

如使用 make menuconfig 配置内核,又碰巧系统没有安装 ncurses 库 (ubuntu系统 默认没有安装此库), 会出现错误:

Unable to find the ncurses libraries or the required header files. *** ‘make menuconfig’ requires the ncurses libraries.


*** Install ncurses (ncurses-devel) and try again.


make[1]: [scripts/kconfig/dochecklxdialog] Error 1 make: [menuconfig] Error 2


解决方法, 安装ncurses库: $sudo apt-get install libncurses5-dev

  • ncurses库是字符终端下屏幕控制的基本库,可能很多新开发的程序都不使用了,不过如果要编译一些老程序,还经常用到

Motto

  • If you find something too difficult to finish, dividing it into several steps and continuing find the right approach that you can make progress. Finally, you will be a superman.
  • Don’t trouble troubles, unless the troubles trouble you.
  • If you are in blue, hang in there, don’t be afraid and never finch. Go forward and insisting advance step by step.
  • Never eat a fat one. The fastest way to position the problem is divide it into small segamentations and deal whit them one by one.
  • If you find something that beyond you control, what you need to do is “combing” so that resources perform their duties.
  • Little learning is a dangerous thing.
  • Take it easy and don’t panic.
  • Too young, too simple and too naive, so talking after thinking.
  • Make sure you are in the right direction before work hard.
  • See others’ advantages and self’s shortcomings.
  • Take care of self and family.

Linux Notes II

  • Ubuntu 的默认 root 密码是随机的,每次开机都有一个新 root 密码。我们可以在终端输入命令 sudo passwd,然后输入当前用户的密码

  • 终端会提示我们输入新的密码并确认,此时的密码就是 root 新密码。修改成功后,输入命令 su root,再输入新的密码

  • 普通用户变超级用户 su; 超级用户变普通用户 sudo ngcl (su + 用户名)

  • date, 显示当前时间

  • cal, 查看当月日历

  • df, 查看当前的硬盘挂载情况; df –h 显示磁盘空间使用的情况

  • free, 显示可用内存, 查看当前的磁盘交换空间

  • exit, 切换超级管理员和普通用户, 或者使用 su / su ngcl

  • ctrl + alt + F1~F6, 可访问黑屏幕终端; 按 alt + F7, 返回图形桌面幻镜.

  • “.” 代表工作目录, “..”代表工作目录的父目录. 例如: cd /usr/bin <==> cd ./bin

    pwd: 结果都是 /usr/bin, 因为 . 代表了当前目录 /usr

  • file: 确定文件类型; 例如: file sketch.txt sketch.txt: ASCII text file 命令会打印出文件内容的简短说明.

  • less / cat: 查看文件内容 less 程序让我们前后滚动文件.

  • ls /usr: 指定要显示的目录

  • ls - /usr: 指定多个目录

  • 命令后面跟一个或多个选项,带有不同选项的命令其功能不一样; 此外, 命令后面还跟有一个或多个参数, 这些参数是命令作用的 对象. 大部分命令的格式: command -option arguments

  • ls -lt ls -lt –reverse (以相反的顺序输出)

  • ls 选项 -a, 列出所用文件 -d, 与-l选项结合使用, 可查看目录的详细信息 -F, 在每个所列出的名字后面加上类型指示符(例如, 如果名字是目录名, 则会加上一个斜杠) -r, 以相反的顺序显示结果 -S, 以文件大小对结果排序 -t, 按修改时间排序

  • 在UNIX操作系统中, 一切都是文件

  • UNIX 目录

    • /, 根目录, 一切从这里开始
    • /bin, 常用的基本命令
    • /sbin, 管理系统相关的基本命令
    • /boot, 存放启动内核以及启动内核的相关文件, 例如内核、grub等
    • /dev, 设备文件
    • /etc,各类配置文件
    • /etc/crontab, 定义自动化任务运行的时间
    • /etc/fstab, 存储设备以及相关挂载点的列表
    • /etc/passwd, 用户账号列表
    • /home, 用户登录,除 root 用户外其他可登录用户的主目录
    • /lib, 常用的基本函数库,内核模块,与 windows 系统中的 DLL 类似
    • /lost+found, 当文件崩溃时,该目录用于恢复分区。除非系统发生很严重的问题,否则这个目录一直是空的
    • /libexec, 非用户直接使用的脚本或命令
    • /media, 用于设备挂载
    • /mnt, 古老的用于挂载设备的目录
    • /opt, 存放一些大型的独立软件
    • /sys, 用于存放Linux内核的SYS文件系统
    • /tmp, 存放临时文件,可以被任何用户使用
    • /var, 用于存放一些日志和程序启动的 PID 文件
    • /usr, 是linux系统中最大的目录树。包含普通用户使用的所有程序和相关文件
    • /usr/include, 头文件存放目录
    • /usr/bin:存放常用的命令
    • /usr/sbin:存放管理员常用的命令
    • /usr/lib:库函数
    • /usr/share:用于存放各种软件包共享的辅助文件
    • /usr/doc:存放软件说明
    • /usr/man:存放各种命令,文件,函数
  • cp: 复制文件和目录

    • cp item directory 例如: cp cleanup.py /home/ngcl/图片
    • cp file1 file2: 将file1 复制到 file2. 如 file2 存在,会被 file1 覆盖,如 file2 不存在,则创建 file2

    • cp -i file1 file2 覆盖时,通知用户确认

    • cp file1 file2 dir1 将 file1 和file2 复制到 dir1, dir1 必须已经存在

    • cp dir1/* dir2 使用通配符,将 dir1 中所用文件复制到 dir2, dir2 必须已经存在

    • cp -r dir1 dir2 将 dir1 目录复制到 dir2 目录中,如果 dir2 不存在,创建 dir2, 且包含与 dir1 目录相同的

  • mv: 移动或重命名文件和目录

    • mv item1 item2, 将文件(或目录)item1移动(或重命名)为item2

    • mv item… directory 将一个或多个条目从一个目录移动到另一个目录

    • mv的选项:

      • -i, 覆盖一个已经存在的文件之前,先提示用户。
      • -u, 将文件从一个目录移动到另一个目录,只移动那些目标目录中不存在的文件或是目标目录里相应的更新文件
      • -v, 移动文件时显示信息性消息
  • mkdir: 创建目录 mkdir directory

  • rm: 移动文件和目录

    • 警告,无法恢复
    • 要和 -i一起使用,可以提示用户
    • 不要和通配符 × 一起使用
    • 不要和递归符号 r 一起使用
  • in: 创建硬连接和符号连接

    • 为某文件在另外一个位置上建立同步的链接,当需要在不同目录用相同的文件,不必重复占用磁盘空间
    • in 创建硬连接,实际上是创建了额外的名称,这些名称都指向同一部分数据部分
    • in -s, 使用 -s 参数创建软链接
    • 可以使用 ls -li 显示上述信息,可以看到 fun 和 fun-hard 共享同一个索引节点号,证实它们是相同的文件
    • Linux / Unix 档案系统中,有所谓的链接(link),我们可以将其视为档案的别名,而连结又可分为两种 : 硬链接 (hard link)与软链接 (symbolic link)
      • 硬链接的意思是一个文件可以有多个名称, 存在于同一个磁盘分区中. 与目标文件使用同一个文件索引节点,因此只能在同一个磁盘分区中使用硬链接,并且它不能离开关联文件而独立存在。当一个硬链接被移动,重命名或者被删除时,其余关联到同一文件的硬链接不受影响。当最后一条批向该文件的硬链接被删除时,该文件内容将会消失
      • 软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。软链接却可以跨越不同的档案系统. 如同直接对目标文件进行操作,链接文件是一个独立文件,其存在不依赖于目标文件。如删除一个链接文件,它指向的目标文件不受影响;如果删除了一个目标文件,其指向目标文件的链接文件依然存在
      • ln source distination 是产生一个连结 distination 到 source,至于使用硬链接或软链结则由参数决定
      • 不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁碟空间
  • type: 显示命令的类型 例如: type grep

  • which:显示可执行程序的位置

  • help: 显示命令的使用信息

  • man:显示程序的手册

  • whatis:显示命令的简要描述

  • cat: 读取一个或多个文件,并把它们复制到标准输出文件中。 例如:cat >> lazy_dog.txt (以追加方式写到结尾)

  • uniq: uniq – 删除列表中重复的行 | sort | uniq | less

  • wc: 打印行数,字数,和字节数 18,172,1053 output.txt

  • grep: 打印匹配行,查找匹配文本 grep pattern [file …]

例如:ls /bin /usr/bin | sort | uniq | grep zip

  • head: 输出文件的前10行, head output.txt

    可以和管道一起用: ls /usr/bin | head

  • tail: 输出文件的后10行, tail output.txt

    ls /usr/bin | tail

  • tee: 从 stdin 读取数据

    • “>” (重定向,重新定义标准输出内容发送到哪里,后接文件名,可以把标准输出重定向到另一个文件中,而不是显示到屏幕上) 例如: ls -lit > output.txt 目的文件通常会从文件 “开头” 部分重新改写。(所以可以用来删除文件)

    • “>>” (重定向, 将输出内容在文件尾部添加)

  • 管道 “|”: 使用管道操作符 “|”,可以把一个命令的标准输出送到另一个命令的标准输入中: command1 | command2

    例如: ps aux | grep python 将当前进程传入到 grep python 中,看当前运行的 python 进程

  • 过滤器: ls /bin /usr/bin | sort | less 把目录下的所有可执行程序合并成一个列表,并且排序

  • mkdir / rmdir + 花括号扩展: mkdir {2014..2015}-0{1..9} {2014..2015}-0{10..12} rmdir {2014..2015}-0{1..9} {2014..2015}-0{10..12}

  • 使用历史命令: history | less, 查看历史列表

history | grep /usr/bin, 查看有/usr/bin内容的命令

  • !!: 重复最后一个执行的命令

  • gcc –dumpspecs 会导出 GCC 默认的配置内容

  • sed 文本处理工具,修改原文件

  • !!: 重复最后一个执行的命令

  • 权限属性: chmod –v a+wt r: 许可打开和读取文件 w: 写入 x: 把文件当做程序来执行

    0 000 — 1 001 –x 2 010 -w- 3 011 -wx 4 100 r– 5 101 r-x 6 110 rw- 7 111 rwx

    文件所有者|组用户|其他所有用户 —|—|— u | g | o a: u, g, o 三者的组合; u (文件拥有者), g (所属组成员), o (其他用户)

  • 进程

    • 系统启动时,内核先把它的一些程序初始化为进程,然后运行一个称为init的程序。init依次运行一系列称为脚本(init script)的shell脚本(放在/etc目录下),这些脚本将会启动所用的系统服务

    • 一个程序可以除法其他程序的运行,在进程中这种情况叫“父进程创建子进程”

    • 内核会被保存每个进程的信息以便确保任务有序进行。比如:每个进程将被分配一个PID(process ID)的号码。init进程的PID时钟是1.

    • ps aux, 查看进程信息

    • top, 查看极其运行情况的动态视图

    • ping, 向网络主机发送特殊数据包,验证网络连接是否正常 ping linuxcommand.org

    • traceroute, 跟踪网络数据包的传输路径,显示文件通过网络从本地传输到指定主机过程中所有停靠的列表。 traceroute slashdot.org

    • netstat, 检查网络设置以及相关统计数据 netstat -ie, 检查系统中的网络接口信息 netstat -r , 显示内核的网络路由表

    • ftp, 采用文件传输协议传输文件 lftp, 更好的ftp wget, 非交互式网络下载工具

  • mount挂载命令,mount [选项] 设备名 目录名

    • 要挂载一个 EXT3 文件系统的磁盘分区到 /mnt 目录下,使用如下命令: mount /dev/sda3 /mnt (/dev/sda3是挂载分区,/mnt是被挂载的目录)
    • mount /dev/sdb2 /mnt 挂载 /dev/sdb2 到 /mnt 下
    • umount /dev/sdb2 /mnt
      卸载 /dev/sdb2 从 /mnt 中
    • mkswap /dev/sdb1 使sdb1作为交换分区
    • swapoff /dev/sdb1 取消/dev/sdb1的交换分区
  • ps | grep 和 ps aux | grep

    • ps: 显示当前状态处于 running 的进程,grep 表示在这里搜索
    • ps aux: 是显示所有进程和其状态 例如:ps aux | grep python

    • ps aux seems to conveniently list all processes and their status and resource usage

    • What does aux mean? a = show processes for all users u = display the process’s user/owner x = show processes not attached to a terminal
  • Linux命令前面加 ! 号

  • 比如 ps 跟 !ps 有什么区别 执行最近时间的命令参数,比如最近输入ls -l,再输入!ls,系统就会按照最近时间的命令ls -l执行

  • uname –a 查看内核系统基本信息

  • make

    • make clean
      删除大多数的编译生成文件, 但是会保留内核的配置文件 .config, 还有足够的编译支持来建立扩展模块
    • make mrproper
      • 删除所有的编译生成文件, 还有内核配置文件, 再加上各种备份文件
      • 在每次配置并重新编译内核前需要先执行 “make mrproper” 命令清理源代码树, 包括过去曾经配置的内核配置文件 “.config” 都将被清除. 即进行新的编译工作时将原来老的配置文件给删除到, 以免影响新的内核编译
  • dos2unix, 将windows格式转换为unix格式 unix2dos, 将unix格式转换为windows格式

  • 当不知道用哪条命令时

    • apropos: 当需要完成特定任务但又不知道命令的名字时,可使用关键字和 apropos 工具进行搜索。
    • whatis: 和 apropos 很相似,但 whatis 仅搜索与关键字完全匹配的信息
  • 获取用户和系统信息:

    • who: 列出系统上的用户
    • who am i: 得到用户正使用的终端或登录的时间
    • finger: 列出系统上的用户
    • write username: 给某人用户发消息
  • ls –F 使得目录后显示斜杠,可执行文件后显示星号 *

  • rm –r 递归删除目录,删除目录中包含的目录和文件,还有目录自身

Linux Notes I

  • 内核

    • 进程调试: Linux 是抢占式多任务操作系统. 多个进程可同时驻留于内存, 每个进程都能获得对 CPU 的使用; 每个进程能使用多长时间, 由内核进程调度程序决定
    • 内存管理: 物理内存 RAM 属于有限资源, 内存必须公平, 高效地在进程间共享这一资源. Linux 采用了虚拟内存管理机制, 具有以下两方面的优势:
    • 进程与进程之间、进程与内核彼此隔离, 一个进程无法读取或修改内核或其他进程的内存内容
    • 只需将进程的一部分保持在内存, 不但降低了每个进程对内存的需求量, 而且还能在 RAM 中同时加载更多的进程
    • 文件系统: 内核在磁盘上有文件系统, 允许对文件执行创建, 获取, 更新和删除等操作
    • 创建和终止进程: 内核可以将新程序载入内存, 为其提供运行所需的资源, 一个运行中的程序称之为”进程”, 一旦进程执行完毕, 内核要确保释放其占用的资源, 供后续重新使用
    • 联网: 内核以用户进程的名义收发网络消息 (数据包). 该任务包括将网络数据包路由至目标系统
  • 内核态(核心态, 监管态)和用户态

    • 在用户态下运行时, CPU 只能访问用户空间内存, 试图访问属于内核空间的内存会引发异常
    • 运行于核心态时, CPU 既能访问用户空间内存, 也能访问内核空间内存
    • 仅当处理器在核心态运行时, 才能执行某些特定操作. 这样的例子包括:
    • 执行停机(halt)指令去关闭系统,
    • 访问内存管理硬件
    • 以及设备 I/O 操作的初始化
    • 实现者们利用这一硬件设计, 将操作系统置于内核空间. 确保了用户进程不能访问内核指令和数据结构, 也无法执行不利于系统运行的操作
    • 某进程可以请求内核创建另一个进程
  • Shell

    • 用于读取用户输入的命令, 并执行相应的程序以响应. 也叫 “命令解释器”
    • 术语登陆 Shell (login shell) 是指用户刚登陆系统时, 由系统创建, 用以运行 Shell 的进程
    • Shell 只是一个用户进程. 登入同一台计算机的不同用户同时可使用不同的 Shell
  • 文件 I/O 模型

    • UNIX 系统 I/O 模型最显著的特性之一是其 I/O 通用性的概念. 同一套系统调用(open(), read(), write(), close()等) 所执行的 I/O 操作, 可施之于所有文件类型, 包括设备文件在内
    • 就本质而言, 内核只提供一种文件类型: 字节流序列, 在处理磁盘文件时, 可通过 lseek() 系统调用来随机访问
  • 命令行参数

    • 程序的 main() 函数需要做如下声明: int main (int argc, char* argv[]);
    • argc: 命令行参数的总个数
    • argv: 指针数组的成员指针则逐一指向每个命令行参数字符串. 首个字符串 argv[0], 标识程序名本身
  • 进程

    • 正在执行的程序实例. 执行程序时, 内核会将程序代码载入虚拟内存, 为程序变量分配空间, 建立内核记账数据结构, 以记录与进程有关的各种信息
    • 在内核看来, 进程是一个个实体, 内核必须在它们之间共享各种计算机资源
    • 对于像内存这样的受限资源来说, 内核一开始会为进程分配一定数量的资源, 并在进程的生命周期内, 统筹该进程和整个系统对资源的需求, 对这一分配进行调整
    • 程序终止时,内核会释放所有此类资源,其他进程重新使用
    • 其他资源(如CPU、网络带宽等)都属于可再生资源,但必须在所有进程间平等共享
    • 逻辑上将一个进程划分为以下几部分(也称为段)
    • 文本: 程序的指令
    • 数据: 程序使用的静态变量
    • 堆: 程序可从该区域动态分配额外内存
    • 栈: 随函数调用、返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间
  • 创建进程和执行程序

    • 使用系统调用 fork() 来创建一个新进程. 调用 fork() 的进程被称为父进程, 新创建的进程则被称为子进程.
    • 内核通过对父进程的复制来创建子进程. 子进程从父进程处继承数据段, 栈段以及堆段的副本后, 可以修改这些内容, 不会影响父进程的 “原版” 内容
    • 子进程要么去执行与父进程共享代码段中的另一组不同函数, 或者, 更为常见的情况是使用系统调用 execve() 去加载并执行一个全新程序
    • execve() 会销毁现有的文件段、数据段、栈段和堆段,并根据新程序的代码, 创建新段来替换它们
  • 进程 ID 和父进程 ID

    • 每一个进程都有一个唯一的整数型进程标识符 PID. 此外, 每一个进程还具有一个父进程标识符(PPID)属性, 用以标识请求内核创建自己的进程
  • 终止进程

    • 使用 exit() 系统调用, 或相关的 exit() 库函数
    • 向进程传递信号, 将其 kill
    • 无论以任何方式退出, 进程都会生成 “终止状态”
  • init 进程

    • 系统引导时, 内核会创建一个名为 init 的特殊进程, 即”所有进程之父”, 该进程的相应程序文件为 /sbin/init
    • 系统的所有进程不是由 init (使用 fork())“亲自”创建, 就是由其后代进程创建. init进程的进程号总为1, 且总是以超级用户权限运行
    • 谁 (哪怕是超级用户) 都不能”杀死” init 进程, 只有关闭系统才能终止该进程
    • init 的主要任务是创建并监控系统运行所需的一系列进程
  • 进程间通信与同步机制

    • 信号 (signal), 用来表示事件的发生
    • 管道 (即shell中的 “|” 操作符) 和 FIFO, 用于在进程间传递数据
    • 套接字 (SOCKET), 供同一台主机或是联网的不同主机所运行的进程之间传递数据
    • 文件锁定, 为防止其他进程读取或更新文件内容, 允许某进程对文件的部分区域加以锁定
    • 消息队列, 用于在进程间交换消息(数据包)
    • 信号量 (semaphore), 用来同步进程动作
    • 共享内存, 允许两个及以上进程共享一块内存. 当某进程改变了共享内存的内容时, 其他所有进程会立即了解这一变化
  • 线程

    • 每个进程都可执行多个线程, 可将线程想象为共享同一虚拟内存及一干其他属性的进程
    • 每个线程都会执行相同的程序代码, 共享同一数据区域和堆 但是, 每个线程都拥有属于自己的栈, 用来装载本地变量和函数调用链接信息
    • 线程之间可通过共享的全局变量进行通信
    • 借助于线程 API 所提供的条件变量和互斥机制, 进程所属的线程之间得以相互通信同步行为, 尤其是在对共享变量的使用方面
    • 此外, 线程间也能彼此通信