第一章:引言
1.3本书目标
(1)强化学生的编程背景知识
(2)动态数据结构的作用
(3)进程概念和进程管理
(4)并发编程
(5)定时器和定时功能
(6)信号、信号处理和进程间通信
(7)文件系统
(8)TCP/IP和网络编程
1.13使用Linux
Linux内核位置:/boot Linux内核映像的三部分:BOOT|SETUP|linux kernel Linux登录进程的三个文件流:stdin、stdout和stderr
Linux命令执行:登录后,用户进程通常会执行命令解释程序sh,后者将提示用户执行命令。sh将直接执行一些特殊命令,如cd、exit)、logout。
1.15Unix/Linux文件系统组织
1.15.3 Unix/Linux中最常用的命令
-
ls:ls dirname:列出CWD或目录的内容。
-
cd dirname:更改目录。
-
pwd:打印CWD的绝对路径名。
-
touch filename:更改文件名时间戳(如果文件不存在,则创建文件)。
-
cat filename:显示文件内容。
-
cp src dest:复制文件
-
mv src dest:移动或重命名文件。
-
mkdir dirname:创建目录。
-
rmdir dirname:移除(空)目录。
-
rm filename:移除或删除文件。
-
ln oldfile newfile:在文件之间创建链接。
-
find:搜索文件。
-
grep:搜索文件中包含模式的行。
-
ssh:登录到远程主机。
-
gzip filename:将文件压缩为.gz文件。
-
tar -zcvf file.tgz.:从当前目录创建压缩tar文件。
-
tar -zxvf file.tgz.:从.tgz文件中解压文件。
-
man:显示在线手册页。
-
zip file.zip filenames:将文件压缩为.zip文件。
-
unzip file.zip:解压.zip文件。
1.16 Ubuntu Linux 系统管理
1.16.1 用户账户
与在Linux中一样,用户账户信息保存在/etc/passwd文件中,该文件归超级用户所有,但任何人都可以读取。
1.16.2 添加新用户
我们可以假设:用户想添加一名家庭成员,以便使用同一台计算机。与在Linux中一样,Ubuntu支持“adduser”(添加用户)命令,运行方式如下:
sudo adduser
username 新用户可通过选择新用户名来登录系统。1.16.3 sudo命令
出于安全原因,Ubuntu禁用了根或超级用户账户,这可防止任何人以根用户身份登录()。sudo(“超级用户执行”)允许用户提升到超级用户特权级别。完成命令执行后,用户进程将恢复到原来的特权级别。
2.1 Linux中的文本编辑器
Linux中,文件编辑、文本编辑是必不可少的基本操作。首先学习vim,即使用命令行进行文本编辑,若熟练掌握其中的命令,就可以很快完成。gedit:类似于Windows中的记事本,是一个简单的图形界面文本编辑器。emacs:更加强大,具有更多功能的图形界面文本编辑器。
2.1.1 vim
vim有3种不同的操作模式,分别是
-
命令模式:用于输入命令
-
插入模式:用于输入和编辑文本。
-
末行模式:用于保存文件并退出。
vim启动时,处于默认的命令模式
移动光标的命令键示例如下:
h:将光标向左移动一个字符
l:将光标向右移动一个字符
j:将光标向下移动一个字符
k:将光标向上移动一个字符
要输入文本进行编辑,用户必须输入i(插入)或a(追加)命令将vim切换到插入模式:
:w:写入(保存)文件。
:q:退出vim。
:wq:保存并退出。
要退出插入模式,请按ESC键一次或多次。在命令模式下,输入“:”进入末行模式,将文本保存为文件或退出vim。
2.7.1 makefile格式
一个make文件由一系列目标项、依赖项和规则组成。目标项通常是要创建或更新的文件,但它也可能是make程序要引用的指令或标签。目标项依赖于一系列源文件、目标文件甚至其他目标项,具体描述键依赖项列表。规则是使用依赖项列表构建目标项所需的命令。
例子:
一个C程序,三个源文件:type.h、mysum.c、t.c 使用gcc编译: gcc -o a.out main.c mysum.c 使用makefile:有一个名为Makefile的文件:
myt:type.h t.c mysum.c #依赖列表
gcc -o myt t.c mysum.c #rule命令,make时执行。
2.7.2 make程序
当make程序读取makefile时,它通过比较依赖项列表中源文件的时间戳来确定要构建哪些目标项。如果任何依赖项在上次构建后有较新的时间戳,make将执行与目标项有关的规则。假设我们有一个C语言程序包含3个源文件:
-
type.h file:
// 头文件int mysum(int x, int y)
// types, constants,etc -
mysum.c file
// C语言中的函数
#include <stdio.h>
#include "type.h"
int mysum(int x, int y)
{
return x+y;
}
t.c file:
#include <stdio.h>
#include "type.h"
int main()
{
int sum = mysum(123,456);
printf("sum = %d\n", sum);
}
通常,我们会使用sh命令
gcc -o myt main.c mysum.c
生成一个名为myt的二进制可执行文件。下面我们将使用makefile演示C语言程序设计的编译链接。
2.7.3 makefile示例
示例2.5:makefile。 (1)创建名为mk1的makefile,包括:
myt:type.h t.c mysum.c # target: dependency list
gcc -o myt t.c mysum.c # rule: line MUST begin with a TAB
在本示例中,生成的可执行文件名myt通常与目标项名称匹配。这允许make通过将目标项时间戳与依赖项列表中的时间戳进行比较,来决定稍后是否再次构建目标项。 (2)使用mk1作为makefile运行make:make通常使用默认的makefile或Makefile,即当前目录中出现的makefile。它可以通过-f标志直接使用另一个makefile,如:
make -f mk1
make将构建目标文件myt,并将命令执行显示为:
gcc -o myt t.c mysum.c
(3)再次运行make命令,将会显示消息:
make:'myt' is up to date
在这种情况下,make不会再次构建目标,因为在上次构建后没有任何文件更改。
(4)相反,如果依赖项列表中的任何文件有更改,make将再次执行rule命令。一种简单的文件修改方法是使用touch命令,修改文件的时间戳。那么,如果我们输入sh命令:
touch type.h
// or touch *.h, touch *.c, etc.
make -f mk1
make将重新编译链接源文件,以生成新的myt文件。 (5)如果我们从依赖项列表中删除一些文件名,即使这些文件有更改,make也不会执行rule命令。读者可以尝试自行验证。 可以看出,mk1是一个非常简单的makefile,它与sh命令的差别不大。但是,我们可以改进makefile,使之更加灵活和通用。
makefile 变量:makefile支持变量。在makefile中,%是一个与sh中的*类似的通配符变量。makefile还可以包含自动变量,这些变量在匹配规则后由make设置。自动变量规定了对目标和依赖项列表中元素的访问,从而用户不必显示指定任何文件名。自动变量对于定义一般模式规则非常有用。以下列出了make的一些自动变量。
-
$@:当前目标名
-
$<:第一个依赖项名
-
$^:所有依赖项名
-
$*:不包含扩展名的当前依赖项名
-
$?:比当前目标更新的依赖项列表
2.8 GDB调试工具
gdb断点设置指令总结:
(gdb)break 7 //以行号设置断点
(gdb)break function_name //以函数名设置断点
(gdb)clear 行号 //删除这行的断点
(gdb)clear 函数名 //删除该函数的断点
(gdb)delete breakpoints n //删除第n次(指定编号)设置的断点
(gdb)clear //删除程序中所有的基于行设置的断点
(gdb)delete //删除程序中所有的断点
(gdb)r //执行程序
(gdb)n //单步调试
(gdb)c //执行到下一个断点
(gdb)print 变量或表达式 //打印变量或表达式当前的值。
(gdb)print 变量=值 //对变量进行赋值
(gdb)whatis 变量或表达式 //显示变量类型
(gdb)set variable 变量=值 //变量赋值
二、问题与解决思路
问题:安装ubuntu后,虚拟机黑屏。
网上查询后,发现是由于显卡驱动问题导致,安装好显卡驱动后成功。
解决办法:
-
选择相应内核的“recovery model”
-
进去系统之后编辑'''/etc/default/grub''' 这个文档
sudo gedit /etc/default/grub
3.找到这一行:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"
sudo update-grub
5.存档,并重启。
参考:https://zhuanlan.zhihu.com/p/436853550
三、实践内容与截图
使用vim创建c语言文件 vim hello.c
输入i切换到插入模式编辑代码 编辑完后输入":"进入末行模式,输入:wq退出并保存
程序实现了输出“hello linux” 进行简单的乘法 结果6.000000
新建makefile文件 nano makefile 编辑
make编译 ./main1运行
运行成功 可以看到结果6.000000