《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 777grep与正则表达式
头,$尾,[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.508ps -l命令、ps -ef命令
查看进程—ps
ps [-lauxwm]
• l:以长列表形式显示
• w:以加宽格式显示
• a:显示所有用户进程
• u:按用户名和启动时间的顺序显示进程
• x:显示无控制台进程
• ef:全部进程+完整信息
常用组合:-aux 显示所有进程
进程监控—topwho、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章什么是系统调用、什么是函数?
系统调用:是面向硬件的调用,无缓冲区
函数:是程序的apichmod函数
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():写入bufopen文件时如果采用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中可以找到父进程pidWIFEXITED、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/