《Linux程序设计》各章知识点梳理
 第1章
-  软件包的管理方式方面,Ubuntu、CentOS的差异 
 Ubantu使用APT,CentOS使用YUM
-  如何添加一个新用户? 
 Useradd new_user_name
-  什么是Shell? 
 Shell 是一个用 C 语言编写的程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
-  如何查看一条命令的帮助文档? 
 man 命令
-  ls命令的各种选项 
-  -l(长格式):以长格式列出信息,包括文件权限、所有者、大小和最后修改时间。 
 ls -l
-  -a(所有文件):显示所有文件和目录,包括以点(.)开头的隐藏文件。 
 ls -a
-  -h(易读格式):与 -l 结合使用时,以易读的格式显示文件大小(例如,以 K、M 或 G 显示)。 
 ls -lh
-  -t:按修改时间排序,通常与 -l 结合使用。 
 ls -lt
-  -d:仅显示目录本身的信息,而不是目录内容。 
 ls -d mydir
-  -p:在每个文件或目录名后添加一个斜杠(/),以区分文件和目录。 
 ls -p
-  -i:显示文件的 inode 号。 
 ls -i
-  建立、复制、删除目录 
 建立:mkdir
 复制:cp -r src dst
 删除:rm -r(通用)、rmdir(删除空目录)
-  cd命令,如何进入特定的目录,例如主目录、上一层目录等? 
 进入主目录:Cd ~
 进入上一层:cd …
-  chmod命令,修改权限 
 chmod 777
-  grep与正则表达式 
 头,$尾,[a-z],[a-z]非
-  sort命令 
  sort filename.txt
 将 filename.txt 文件中的行输出到标准输出,按字典序排序。
-  wc命令,管道的使用 
 wc -l 统计行数
 wc -c 统计字节
 wc -m 统计字符
 wc -w 统计单词
 管道:|
-  pwd与PWD 
 pwd 是一个命令,显示当前目录
 PWD 是环境变量,显示的也是当前目录的完整路径
-  各种压缩命令,特别是tar命令 
  文件归档
 tar [cx][zj][v]f filename [filelist]
 • c: 创建归档
 • x:展开归档
 • z:调用gzip对归档压缩/解压
 • j:调用bzip2对归档压缩/解压
 • v:显示冗余信息
-  find命令 
  find — 文件搜索
 find [目录] [选项] [动作]
 • -name 按名称查找,可以使用通配符,但必须使用引号括起来
 • -type 按类型查找
 • -exec 将查找到的目标进行进一步处理,exec后跟随处理命令,命令中通过 {} 引用被找的文件,而且命令必须以 “ ;”结束
-  mv命令,移动与改名 
 移动到不存在的文件就是改名
-  ln 与 ln -s,符号链接文件与硬链接文件的区别? 
 符号链接(ln -s):是一种独立的文件,创建时源文件可以不存在,可以跨文件
 名称 命令 类型 源文件 跨文件系统 备注
 符号链接 ln -s 独立文件 可以不存在 可以
 硬链接 ln 与源文件共享一个inode 必须存在 不可以 不能给目录创建硬链接
-  head tail cat more 
  more 命令用于分页查看文件内容。它一次显示一页内容,你可以按回车键查看下一页,或使用空格键查看下一页的下一行。
  less 命令是一个更强大的 more 命令版本,它允许你前后翻页,并且可以搜索文本。less 也可以用来查看压缩文件和管道输出。
  head 命令用于显示文件的开始部分,默认情况下显示前 10 行。
  tail 命令用于显示文件的末尾部分,默认情况下显示最后 10 行。
-  bc计算,与echo命令搭配,如何做计算?如何做小数或浮点数的运算? 
 qiao@qiao-virtual-machine:~/workspace$ echo “scale=3; (12.3 + 4.56) * 7.8” | bc
 131.508
-  ps -l命令、ps -ef命令 
  查看进程—ps
 ps [-lauxwm]
 • l:以长列表形式显示
 • w:以加宽格式显示
 • a:显示所有用户进程
 • u:按用户名和启动时间的顺序显示进程
 • x:显示无控制台进程
 • ef:全部进程+完整信息
 常用组合:-aux 显示所有进程
  进程监控—top
-  who、free 
 who:显示当前在线用户
 free:显示内存信息
-  kill命令及kill函数(C语言) 
 命令:kill -SIGKILL PID
 C语言:int kill(pid_t pid, int sig);
-  大写的PWD、PATH、HOME、USER分别表示什么含义? 
  PWD:当前工作目录路径
  PATH:命令执行路径
  HOME:用户主目录
  USER:用户登录名
-  Shell元字符*、?、[]、{}、~的使用方法 
-  重定向> >> < ,命令的后台执行、顺序执行分别用什么? 
: 输出重定向,会清空文件内容
输出重定向,不会清空文件内容
< 输入重定向
后台执行:&
顺序执行:管道,分号隔开
-  vim有哪几种工作模式?命令模式、末行模式的各种基本操作 
 三种:输入模式,上述两种
 命令模式:dd删除、p粘贴、yy复制
 末行模式:wq保存退出、q不保存退出、q!强制退出
-  Linux文件系统中,有一些默认的目录,例如/etc、/dev等,它们分别存放什么文件? 
 /etc: 存放配置文件
 /dev: 存放设备文件
-  /etc/passwd是什么文件?文件的内容有哪些? 
 存放用户信息
-  如何利用管道将多个命令连接起来完成一个指定的任务,例如“统计所有普通文件所含有的字符数”、“统计所有普通文件的个数” 
 cat file_name | wc -m
 find -type f | wc -l
 第2章
-  bash脚本的第一行 
 幻数,内核程序用以标识这是脚本程序
-  shell脚本中,$0 $1 $2 $# $* $?的含义 
 变量名 含义
 $? 最后一次执行命令的返回码
 $$ 当前脚本自己的PID
 $# 命令行参数的个数
 $0 脚本文件本身的名字
 $1, 2 … 第一、第二个命令行参数“ 2… 第一、第二个命令行参数 “ 2…第一、第二个命令行参数“*” 将所有命令行参数作为一个整体单词看待
 “$@” 将命令行参数作为多个单词看待
-  Shell编程例题 
 #!/bin/bash 幻数
 echo -n enter filename: 不输出换行符,打印enter filename
 read fname 读入文件名存入fname
 echo -n enter words:
 read words
 echo w o r d s 2 > / d e v / n u l l > words 2>/dev/null > words2>/dev/null>fname输出刚读入的words,不输出错误信息,将words内容重定向到fname
 if [ $? –eq 0 ]如果上一条echo命令的返回码为0(也就是成功执行)
 then
 echo Write successfully
 else
 echo write error
 fi
-  知道()、{}、[]、[[]]、 (())的使用方法  () 子shell中执行  如果是arr=(1,2,3),那就是数组赋值  {} 本shell中执行、声明数组、{1..4}生成1-4  上述两个都可以成组命令,使用 && 、||  [] 测试条件  [[]] 更复杂的条件测试,可以对于字符串操作、算数比较 命令替换
  (()) 执行算术运算
-  echo “ i ”与 e c h o ‘ i” 与 echo ‘ i”与echo‘i’的执行结果的区别 
 “” 会替换i变量的值,’’ 不会
-  read命令,read $xyz是否正确? 
 错误,read读入的应该是变量,而不是环境变量
-  牢固掌握if语句的用法 
-  shell下如何做字符串拼接? 
 echo “$word1 $word2”
-  如何判断一个变量是文件还是目录,-e -s的含义 
  -f 普通文件 、-d 目录
  -s 文件大小非零
  -r 可读 -w 可写 -x 可执行
  -L/h 符号链接文件
-  字符串、表达式的比较 
-  for循环,for循环的C语言风格写法 
-  while循环,无限循环,怎么写? 
-  case语句 
-  break 
-  continue 
-  数组,a=(one two three four)是什么含义?如何输出数组的每个元素?如何获取数组的元素个数? 
 echo ${a[@]}
 echo “数组元素个数为: ${#my_array[@]}”
-  斐波那契数列的构造及其求和。 
注:下列内容中,系统调用与函数在说法上没有加以区分。
 第3章
-  gcc -c的含义 
-  gcc编译过程包括哪些步骤,其中的链接步骤指的是什么? 
  预处理(-E,*.i):宏替换
  编译(-S, *.s):C语言转为汇编代码
  汇编(-c, *.o):汇编代码转为机器代码
  链接(gcc):将机器代码和库文件链接
-  静态库与共享库的不同之处是什么? 
 静态库:链接时,库成为代码的一部分
 共享库:运行时将库引用插入,库的代码不复制,需要用到时,操作系统加载
-  make命令的功能、好处?makefile、Makefile的作用,基本结构? 
 功能:自动化编译、
 好处: 节省时间
 结构:
 目标文件:依赖文件
 命令
 第4章
-  时间函数(asctime、localtime、time)的使用方法 
  time_t time(time_t *t) 系统调用,返回自1970.1.1午夜以来流失的秒数。
  struct tm * localtime(const time_t * t)
  char * asctime(const struct tm *tp) 和 char * ctime(const time_t * t) 都是将指定时间转换为字符形式的时间,长度大概26个字母。
-  tm结构的基本属性 
 tm_mday tm_mon
-  如何在C语言中输出当前的时间?(不使用system或exec函数族) 
-  什么是用户空间、什么是内核空间? 
  系统调用在内核空间,是系统内核的所在区域
  库函数调用在用户空间,是普通程序的内存区域
-  getenv函数与env命令 
 都是获取环境变量
 第5章
-  什么是系统调用、什么是函数? 
 系统调用:是面向硬件的调用,无缓冲区
 函数:是程序的api
-  chmod函数 
-  umask函数的作用、umask命令的使用方法 
 mode_t umask(mode_t cmask)
 修改当前进程环境的权限掩码为 cmask:八进制值
 返回修改之前的掩码。
-  stat结构体与stat函数、stat命令的联系、各自的功能。 
 Stat:描述文件其他属性。
 int stat(const char *path, struct stat *buf) 获取指定文件文件的属性信息,并填充到buf。
-  如何根据stat结构体获得文件的类型、权限等信息? 
 先创建一个struct stat结构体,然后使用stat()函数,通过路径,传到stat结构体中。
-  文件描述符与文件指针的区别,各自的应用环境 
 文件描述符(File Descriptor):是一个代表打开文件的整数,由操作系统分配。它用于在系统调用中引用文件。
 文件指针(File Pointer):是一个指向文件当前读取或写入位置的指针。它由程序内部维护,用于顺序访问。
-  open、close、read、write要非常熟悉。读文件、读键盘、输出到屏幕、输出到文件操作要熟悉。 
 open(path,flags):从path按照flags模式打开文件
 close()
 read(fd, buf, count):从fd中读取count字节到buf
 write():写入buf
-  open文件时如果采用O_NONBLOCK方式,则后续的效果是怎么样的? 
 非阻塞:如果打开不成功,立即返回
-  open文件时,O_TRUNC、O_WRONLY是什么方式? 
 清空、只读
-  如何利用C语言实现文件的复制?如何编写属于自己的命令程序,mycp ? 
  先用open打开两个文件给予相应权限,一个read循环,在这个循环中进行write
  将可执行文件添加到$PATH后面
 
-  opendir、readdir、closedir是用来做什么的? 
 打开目录
 经常使用opendir获得一个目录,然后使用readdir进行while循环,其间使用structdirent* entry 进行读取名称,如果想获得其他属性,需要使用struct stat file_stat进行读取(一定不是指针),最后使用closedir
-  如何将指定目录下的文件或目录的详细信息(名称、类型、大小、修改时间等)列举出来? 
 同11
 第6章
-  进程的基本概念 
 进程是运行的程序,是动态的,是操作系统分配和调度资源的基本单位
-  如何获得进程的PID、PPID? 
 Getpid()
 Getppid()
 unistd.h
-  熟练掌握fork函数的用法 
 =0为子进程,>0为父进程,<0为出错
-  父子进程如何交替执行? 
 Wait()、sleep()
-  什么是僵尸进程、什么是孤儿进程,由谁来回收? 
 僵尸进程:一个进程已经终止,但是父进程未对其PCB进行释放
 孤儿进程:使用fork创建的子进程,父进程先于子进程销毁,由init/systemd回收
-  sleep函数的作用? 
 挂起进程,秒
-  如何避免僵尸进程,wait函数、waitpid函数的多种用法 
 避免:在父进程中使用 wait() 或 waitpid() 函数来回收子进程的状态信息。
-  如何产生多个进程,而不发生僵尸进程,进程号之间彼此有什么关联? 
 For循环产生,但是每个父进程都使用wait()等待子进程。
 子进程的ps中可以找到父进程pid
-  WIFEXITED、WEXITSTATUS两个宏是用来做什么的? 
 1->是否正常退出
 2->正常退出的返回值
-  什么是SIGCHILD信号,有什么作用? 
 SIGCHILD 信号是当一个子进程结束时,操作系统发送给父进程的信号。
-  父进程如何给其子进程发送信号,通过什么函数?kill函数与raise函数的区别是什么? 
 通过kill。
  区别:
  Kill可以发给任何程序,只要权限够
  Raise信号发给自己
-  守护进程的特点是什么?如何产生一个守护进程?产生守护进程的每个步骤的作用分别是什么? 
  特点:
  长期运行在后台
  周期性执行任务
  产生 & 作用:
  创建子进程,终止父进程:子进程就是守护进程
  在子进程中创建新会话:确保守护进程不附属于任何会话,不拥有终端
  改变到安全的工作目录:防止目录被删除
  重设工作掩码:确保守护进程创建的文件有合适的权限
  关闭文件描述符:防止守护进程对终端的输出,以及避免文件描述符泄露,确保守护进程不会对用户的文件系统造成影响。
-  什么是进程组、什么是会话组? 
 会话是一组进程的高级集合,会话中的进程共享一个会话 ID(SID)。
-  守护进程是孤儿进程吗? 
 不是
  守护进程不会被回收
  也有父进程(init进程)
-  如何编写简单的守护进程?例如周期性地向指定文件中写入当前的最新时间、如何监督检查指定文件是否被修改过? 
-  system函数与exec函数族的使用方法,区别 
-  exec函数族中execl、execv在使用时,参数方面有何区别? 
 exec函数族格式
  char *const ps_argv[] ={“ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL};
  char *const ps_envp[] ={“PATH=/bin:/usr/bin”, “TERM=console”, NULL};
  execl(“/bin/ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL);
  execv(“/bin/ps”, ps_argv);
  execle(“/bin/ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL, ps_envp)
  execve(“/bin/ps”, ps_argv, ps_envp);
  execlp(“ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL);
  execvp(“ps”, ps_argv);
第7章
-  进程间通信的几种方式是什么? 
 管道、System V IPC和套接字
-  用户进程对于信号响应的方式有哪些?如何编程实现? 
-  alarm函数 
 int alarm(int second)
 设定一个定时器,在指定秒数后向进程自身发送一个SIGALRM信号,该信号默认处理是终止当前进程。
-  signal函数的用法 
 先定义signal_handler,进行信号处理;再使用signal(发生信号,处理函数)进行注册,然后使用。
-  当前进程如何在收到某一特定的信号(例如SIGINT)后,不执行默认的操作,转而执行自定义的操作? 
 自定义操作函数,传入signal 的第二个参数
-  SIGKILL与SIGSTOP的特殊性在哪里?SIGINT、SIGQUIT、SIGTERM的共同点是什么? 
 SIGKILL 的特殊性
 • 不可捕捉:SIGKILL(信号编号 9)是一个强制杀死进程的信号,进程不能捕捉或忽略它。
 • 立即终止:接收到 SIGKILL 的进程将立即终止,不会执行任何清理操作。
 • 系统使用:通常由操作系统或 root 用户用来终止那些不响应其他信号的进程。
 SIGSTOP 的特殊性
 • 不可忽略:SIGSTOP(信号编号 19)用于暂停进程的执行,进程不能捕捉或忽略它。
 • 停止进程:进程接收到 SIGSTOP 后将停止运行,直到接收到 SIGCONT 信号恢复执行。
 • 单向通信:SIGSTOP 只能由发送者控制,接收进程无法控制何时恢复。
 SIGINT、SIGQUIT、SIGTERM 的共同点
 • 可捕捉:这些信号都可以被进程捕捉,进程可以定义自己的信号处理函数来响应这些信号。
 • 终止进程:它们的默认行为都是终止进程,但允许进程通过捕捉信号来执行清理操作。
 • 用户生成:这些信号通常由用户生成,例如 SIGINT 可以通过 Ctrl+C 生成,SIGQUIT 可以通过 Ctrl+\ 生成。
 • 默认行为:它们的默认行为是终止进程,但进程可以通过捕捉信号并执行特定的清理操作来改变这一行为。
 SIGINT
 • 中断信号:通常与 Ctrl+C 关联,用于请求进程终止。
 SIGQUIT
 • 退出信号:通常与 Ctrl+\ 关联,用于请求进程终止并生成核心转储(core dump),用于调试。
 SIGTERM
 • 终止信号:是一个通用的终止信号,用于请求进程正常终止并执行清理操作。
-  什么是管道?什么是匿名管道、什么是命名管道,各自的应用场景是什么? 
  管道是Unix最早支持的IPC形式。
  匿名管道:只能在亲缘进程之间通信
  命名管道:借助于外存解除普通管道只能在同源进程使用的限制
-  如何利用pipe系统调用实现父子进程的管道通信? 
  父进程关闭读端,fd[0],使用write向fd[1]中写
  子进程关闭写端,fd[1],使用read从fd[0]读
-  如何利用匿名管道让父进程写文件、子进程读文件?如何使用dup2函数让操作变得更简单? 
  父进程关闭读端,fd[0],利用dup2(fd[0], 0)将管道写端和标准输出流连接
  子进程关闭写端,fd[1],利用dup2(fd[1], 1)将管道读端和标准输入流连接
-  命名管道文件的类型是以什么开头的? 
 /dev/