赞
踩
博主期末复习时写的总结,文中可能会有错误之处,敬请谅解!
1.添加一个新用户
useradd cyril
2.添加后为其设置密码
passwd cyril
3.为该用户指定命令解释程序
usermod -s /bin/bash cyril
4.为该用户指定用户主目录
usermod -d /home/csdn cyril
5.查看所有用户属性
cat /etc/passwd,对应显示格式为:用户名:口令:用户标识号:组标识号:注释性描述:用户主目录:命令解释程序。如下所示:
6.从一个用户切换到另一个用户
su cyril或者sudo cyril
7.修改用户登录密码
passwd cyril
8.用id命令查看当前自己的身份
9.变量声明与删除
pi=3.1415926,删除:unset pi
10.变量显示
echo $pi
11.导出环境变量
如果在root环境下声明pi,然后su cyril后切换到cyril用户,此时echo $pi不显示,但是如果在父进程root中提前export pi再切换,这时就能在cyril进程中成功显示pi。子进程cyril中修改pi的值,root中pi值不变。
12.ps命令显示当前运行的所有进程
13.动态显示进程信息
top
14.以树结构显示进程
pstree
15.显示文件
ls -a与ls -all显示当前目录所有文件(包含隐藏文件.filename),ls -l --all打印详细信息:
16.显示文件类型
file name
17.which命令查找可执行文件路径
which bash显示bash路径:
18.PATH环境变量
PATH说简单点就是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径。
19.set
set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。
20.env显示所有环境变量
env
21.PS1环境变量
PS1是一个环境变量,主命令提示符,比如可以修改PS1来改变主命令提示符颜色等。
22.PS2环境变量
PS2是二级命令提示符,输入数据时使用
23.环境变量HOME
用户的主目录的路径名。
24.source命令
使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。source filename或者source .filename。
25.cd(change directory)命令
切换当前当前工作目录。
26.pwd(print work directory)命令
显示工作目录。
27.man和info
man提供帮助手册,会跳转至另一界面,按q退出。info同样跳转至另一界面,按n翻页,p回到上一页。
28.执行一个shell命令行时通常会自动打开三个标准文件:标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。cat命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。
29.cat命令
30.输入cat后,用户输入的每一行都立刻被cat命令输出到屏幕上,直到按ctrl+d结束【标准输入接收到EOF(结束)标识符】,如下所示:
31.管道操作符|
管道操作符 “|” 可以把一个命令的标准输出传送到另一个命令的标准输入中。
32.less命令
less 与 more 类似,less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页。命令格式:less [参数] 文件,如下所示:
输入:ls -all | less后:
33.sort命令
sort 可针对文本文件的内容,以行为单位来排序。
34.tee命令
Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
35.> >> < <<
>
>
>file创建一个新文件或者覆盖原有文件,echo ”hello” > file将hello覆盖输入到file。file1 >> file2将文件1的内容追加到文件2。
< file就是把<后面跟的文件取代键盘作为新的输入设备。
36.wc命令
利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。
结果为:5行,5个单词,33字节。
37.2>&1
37.设置重定向覆盖
set -o noclobber /设置禁止重定向覆盖/,set +o noclobber /设置允许重定向覆盖/
38.exec命令
exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。
39.grep命令
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
40.通配符
例如显示/etc目录下,所有以.d结尾的文件或目录:ls -d /etc/.d:
又如显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录:ls -d [mnrp].conf:
41.read命令
read命令用于从标准输入读取数值。read内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。例如:read令终读字串在命令从终端读入字符串放在指的量定的变量file中:
42.test命令
test命令用来完成字符串比较,数值比较,文件测试和逻辑操作。
字符串比较:test “1” = “2”比较两个字符串是否相等;!=;检查长度是否大于0:test -n “”,检查长度是否为0:test -z “”;
43.expr命令
expr用于计算表达式的值并打印。
44.if语句格式
45.case语句
46.for语句
47.while语句
48.until语句(满足条件时结束循环)
49.函数
50.特殊的shell变量(考)
51.vi的三种工作模式
(1)命令模式
用户在shell环境下输入vi即可进入vi编辑器,此时处于命令模式,可以进行各种文档定位和编辑操作。
(2)插入模式
(3)编辑模式
52.附加与插入命令(考)
键入模式下按下esc后再输入上述命令才有效。
53.定位命令
54.文本删除命令
同样是按下esc进入到命令模式后再进行。
55.替换和取消命令
56.文本复制命令
复原命令u,相当于撤销,同样是进入命令模式后生效。
57.保存和退出命令
58.高级编辑选项
59.搜索和替换命令
60.linux下c的编译器为gcc。GNU project C and C++ Compiler;GNU Compiler Collection。
61.gcc -o hello hello.c:GCC编译器驱动程序读取源程序文件hello.c,并将它翻译成一个可执行目标文件hello。然后./hello执行该可执行目标文件。
62.gcc -g -o hello hello.c:生成的可执行程序中包含调试信息。gcc -c:只进行编译不进行链接,会输出一个hello.o文件。-S:输出汇编代码文件,生成一个hello.s,其中包含汇编代码。
63.gcc –E helloworld.c > helloworld_pp.c,预处理;gcc -S helloworld.c汇编;gcc -c helloworld.c:编译;gcc -o helloworld helloworld.o链接。以上四个步骤可以用一条命令代替:gcc -o hello hello.c。
64.gcc -O1 test test.c,对编译过程进行优化,优化级别分为三级:O123,级别越高优化越好,但是编译时间越长,一般情况下O2级别以够用。-O0表示不优化。
65.-I选项:gcc -c -O -I dirname x.c:-O表示要进行优化;-I指定程序x.c中用到的头文件所在的目录,如果只是使用了系统头文件则不需要该选项。执行成功后生成x.o文件。
66.如果hellomain中引用了hellofunc.c头文件,则gcc -o hello hellomain.c hellofunc.c报错,应该写成:gcc -I/usr/include/inc -o hello hellomain.c hellofunc.h。
67.多个程序的编译
其中可执行文件SB是1SB.o一直到2SB.o链接而成的。gcc -o 1SB.o…
68.使用make工具对多个源文件进行管理
CFLAGS指定C语言的编译器参数,即使编译.c文件产生.o文件,gcc -c。LDFLAGS:链接器参数,即o命令。
69.文件的rm命令
rm表示remove,即删除。rm -r表示递归删除,rm -f表示强制删除,rm -rf表示强制递归删除,rm -i删除前询问是否继续。如rm -i bashrc。
70.gzip命令
71.gzip将文件进行压缩,产生.gz后缀文件:
72.makefile书写规则(必考)
73.程序调试gdb
gcc -g sum0.c -o sum0,生成一个可执行文件sum0,然后gdb sum0,即可进入gdb调试状态,输入quit退出调试状态。
注意编译时必须加上g选项:
74.b命令
Breakpoint的简写,设置断点,b 10表示在第十行设置一个断点。
条件断点:b 6 if i == 9,只有在i == 9时才停下来:
75.Run命令
简写为r,表示运行该程序,如果有断点则停下。
76.print命令
简写为p, p sum打印sum的值。
77.next命令
简写为n,紧接着断点继续执行。
78.step命令
简写为s,单步执行,进入函数调用,n会跳过函数调用。
79.continue命令
简写为c:停止后继续运行程序。不再是一步步执行。
80.backtrace命令
简写为bt:回溯函数调用栈,最底层编号为0,依次递增。
81.frame命令
frame i调出第i层信息,如frame 0。
82.up和down命令在调用栈中上下移动。
83.set命令
设置变量的值,如set i=7。
84.set args修改发送给程序的参数,show args显示缺省参数列表。
85.cd pathname
修改当前工作目录。
86.pwd
显示当前工作目录。
87.watch命令
使你能监视一个变量的值而不管它何时被改变。
88.rwatch命令
指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令。
89.awatch命令
指定一个变量,如果这个变量被读或者被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令。
90.info命令
显示与该程序有关的各种信息,如i b显示所有断点信息:
91.delete命令
delete 1删除标号为1的断点,delete 1-5删除1到5。
92.clear命令
93.disable命令
禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数,如disable 5禁止5号断点功能。
94.enable命令
运行断点功能,enbale 5。
95.examine命令
examine指令可以查看指定内存地址中的值,简写为x:
96.display命令
在断点的停止的地方,显示指定的表达式的值。(显示变量)。display i。
97.finish命令
继续执行,直到当前函数返回。
98.until命令
结束当前循环。
99.quit命令,简写为q。
100.系统函数库通常位于usr/lib、lib以及usr/local/lib目录下。例如经常使用的printf就由usr/lib/libc.a中的printf.o提供。.a是静态函数库,.so是动态函数库。
101.创建静态函数库的步骤:
gcc -c -O string.c以及ar rv sring.o libc.a两个命令。ar cv表示新建,r表示附加。比如向一个已经存在的.a文件追加函数库就用rv。gcc -c string.c -o string.o
102.使用静态函数库的步骤
103.系统调用
104.动态函数库.so
gcc -fPIC -c和gcc -shared要考。
gcc -o libtest.so -fpic -shared test.c
文件操作:
105.逻辑磁盘分区是基本的文件储存单元,每个磁盘分区对应一个单独的设备文件。查看系统的逻辑分区:fdisk,fdisk是拿来查看或者调整磁盘分区的命令。运行fdisk -l可以查看逻辑分区。
/dev/sda:36.4GB,表示第一个磁盘大小为36.4GB。第二行:255 heads, 63 sectors/track,4425 cylinders表示该磁盘有255个磁面,63扇区4425柱面。接下来dev/sda1是第一块盘的第一个分区,从柱面1至129,dev/sda2从130到4425。同理第二块磁盘设备用/dev/sdb表示。
106.第四块硬盘的第三个逻辑分区名字:/dev/sdd7,逻辑分区是从5开始编号,7表示第三个逻辑分区。一个硬盘有4个主分区和一个扩展分区,逻辑分区在扩展分区中。
107.操作某一个磁盘:fdisk /dev/sda2,进入后查看分区情况:p命令
详见:https://www.cnblogs.com/ftl1012/p/9248126.html
108.一个逻辑分区只有建立了某种文件系统后才能使用。所以在建立新的逻辑分区后还要对其进行格式化:mkfs命令。执行mkfs.ext2命令可以建立ext2文件系统,比如mkfs.ext2 /dev/sda5。ext2是linux自带的文件系统。
109.在文件系统建立后,必修挂载到系统中才能通过文件管理系统对其进行访问。挂载就是将逻辑磁盘分区与文件系统的指定目录间建立关联。挂载文件系统的两种方式:mount命令进行手工挂载和通过fstab文件进行自动挂载。umount将文件系统卸载。(创建分区+挂载必考,自动挂载必考)。如安装光盘到当前系统/mnt/cdrom目录下:mount -t ios9660 -o ro /dev/cdrom /mnt/cdrom,iso表示文件系统类型,ro表示文件系统权限:只读,包含文件系统的物理块设备为/dev/cdrom,以及新文件系统要安装到的目录名称:/mnt/cdrom
110.系统启动时自动挂载:/etc/fstab。
111.虚拟文件系统VFS:将不同文件系统的具体实现细节隐藏。Linux支持多种文件系统,如FAT、ext2/3、MSDOS等。为此必须使用一种统一的接口对文件系统进行管理,就是VFS。
112.ext2文件系统:第二代扩展文件系统,数据以数据块方式存储,块大小相同,分为:引导块、超级块、inode块、目录块、数据块。
113.文件类型:普通文件-,目录文件d、字符设备文件c、块设备文件b、软链接文件l、管道文件p。设备文件:方便Linux访问外部设备。链接文件:指向一个真实存在文件的链接,快捷方式。管道文件:用于不同进程间的信息传递。
114.文件链接分为硬链接和符号链接,硬:链接文件与被链接文件物理上是同一个文件,对文件进行硬链接后只是增加了文件的引用计数,并没有在物理上增加文件。通过执行ln命令产生硬链接,ln -s符号链接(快捷方式)。
115.文件权限:UGO和ACL,必考UGO。
116.每一个文件必须归属于某一个用户和一个组。UGO通过文件的9个权限位对其进行管理。9个分为三组:文件拥有者权限、与文件归属的用户组同组用户的权限、其他用户访问权限。每一个权限位分为三种:读r写w执行x。如下所示:
对gbd_test,-rwxr-xr-x:第一个-表示gdb_test是一个普通文件;接下来三位rwx表示root用户对其具有三种权限;接下来三位r-x表示与该文件同组的其他用户不具有写权限;最后三位r-x表示其他用户不具备写权限。w必须和x在一起才能发挥作用。
117.文件权限分类:
118.UGO方式下可以通过chmod修改文件权限信息。提供两种方式进行修改:字母方式和数字方式;字母方式rwx,+表示增加权限,-表示剥夺权限。例如chmod g+r cls表示增加同组用户对cls的读权限。数字方式:文件拥有者、组内用户、其他用户各对应三位,三位依次对应rwx:增加权限表示1,否则为0,如:111 101 001,表示组内其他用户不具备写权限。chmod 751 cls表示同组用户增加读权限111 101 001。
119.新建文件的权限与另一个因素有关:当前用户的文件权限掩码(必考)。掩码可以通过访问环境变量UMASK得到,通过执行umask命令修改。
掩码作用过程:新建文件时将UMASK取反,再与制定文件权限位进行and操作,来决定文件的最终权限。
120.ACL下:文件访问控制列表的获取与设置:getfacl与setfacl(考)。
121.文件描述符:文件编程中的概念。非负整数,取值为0到OPENMAX。当进程创建一个新文件或者打开现有文件时,系统内核向进程返回一个文件描述符,其在进程内唯一。ulimit -n获取OPENMAX当前值:1024。当Linux进程启动时,内核默认打开三个文件:标准输入/输出/错误输出文件。其文件描述符分别为012。STDIN_FILENO、STDOUT_FILENO与STDERR_FILENO分别表示012。
122.每个文件都有自己的文件属主(用户ID)及组(用户组ID)。如果该文件可执行,则其被执行时就会在操作系统中形成进程。每个进程都有一个有效用户ID和有效组ID,作用是进行文件存取许可检查。除此之外每个进程还有实际用户ID和实际组ID,是执行该程序的用户ID及其组ID。
123.通常情况下,进程有效用户ID就是实际用户ID(执行者的ID),有效组ID就是实际组ID。但是在Linux中可以通过设置文件属主权限将有效用户ID设置为文件所有者ID(不再是调用该进程的用户ID)。这种机制称为suid,对于组权限也可以设置这种这样的标志,称为sgid,suid通过执行chmod u+s完成,sgid通过执行chmod g+s完成。
124.passwd用于修改密码。密码存于/etc/passwd和/etc/shadow中,只有root用户对其可写。suid:usr/bin/passwd文件设置了suid权限:-rwsr-xr-x,普通用户在修改密码时,其有效用户会变成root(文件属主)。
125.文件创建函数
文件创建函数有creat、open、mknod、mkdir等。mknod用于设备文件创建,mkdir用户目录文件创建。creat和open是系统调用。
int creat(pathname, mode_t mode):pathname是要创建文件的路径,绝对路径和相对路径都可以使用;mode:新文件的访问权限,定义在<sys/stat.h>中,一共九种。若创建成功返回文件描述符,出错返回-1。
int open(pathname, int oflag, mode):oflag:打开文件的方式,如只读打开,只写打开等;mode可选,只在创建新文件时有效;成功返回文件描述符,否则-1。
126.文件读写
read函数用于从一个打开的文件中读取数据:ssize_t read(int filedes, void *buff, size_t nbytes):filedes为打开文件的文件描述符,buff为缓冲区,用于缓存读出的数据,nbytes为要读取的字节数。若成功返回实际读取的字节数,如果已经读到文件尾返回0,若出错返回-1。
write函数用于向一个打开的文件写入数据:ssize_t write(同上):buff为缓冲区,准备写入文件的数据。若成功返回实际写入的字节数,出错返回-1。
127.文件的关闭和删除
在文件描述符使用完毕后,程序中应调用close函数显式关闭文件描述符,解除文件描述符与内核数据结构的关联,释放相关资源。int close(int filedes),成功返回0否则-1。
删除文件只是将文件的引用数-1,只有文件的引用计数为0时才会物理删除一个文件:int unlink(path):path为要删除的文件路径,成功返回0否则-1。
128.移动文件读写指针位置
每个被打开文件都有与其相关联的当前文件位移,为非负整数,用于衡量文件开始处到当前读写指针的位置,off_t lseek(int f_d, off_t offset, int whence):fd为文件描述符,offset为文件偏移量,偏移基准为whence。
129.改变文件属主
每个文件都有唯一用户属主,即文件拥有者。修改文件属主及文件权限的操作只允许超级用户(uid=0)和文件拥有者进行。int chown(pathname, owner, group),int fchown(fd, owner, group),int lchown(pathname, owner, group):pathname为文件路径,fd为已经打开文件的描述符,owner为变更的用户id,group为组id,lchown用于修改符号链接本身的属主,而不是符号链接指向的文件。fchown和chown一致。
130.设置文件权限(必考UGO)
int chmod(pathname, mode),int fchmod(fd, mode):修改文件或者已打开文件的权限,将其修改为mode。如chmod(pathname, S_IRUSR|S_IWUSR)。
mode_t umask(mode_t mask):为进程设置文件权限屏蔽字。
int access(pathname, mode):获取一个文件的访问权限,如果当前文件具备mode权限,就返回0否则-1。
ACL不考:
131.获取文件状态(必考)
文件状态信息:文件类型、大小以及创建时间等。相关系统调用分为:获取文件的状态信息和文件系统的状态信息。
首先是文件状态信息的获取:stat、fstat和lstat。int stat(file, struct stat *buf),int fstat(fd, buf), int lstat(file, buf):file为文件名称,fd文件描述符,buf为指向stat结构的指针,用于保存获取的文件状态数据。
文件系统状态信息的获取:statfs获取:int statfs(file, buf)。
132.文件类型的获取(必考)
文件类型的获取依赖于文件状态信息的获取,stat返回的文件状态信息中有一个st_mode项,利用该项可以判断文件类型:上述m表示st_mode项。
133.修改文件时间
每个文件对应三个时间:文件数据存取时间(read)、修改时间(write)、i结点状态修改时间(chmod)。int utime(file, struct utimbuf * times):将file的时间设置为times,里面包含文件存取时间和修改时间两项。
134.目录操作(创建必考)
135.创建目录的系统调用是mkdir。int mkdir(char* path, mode_t mode):path为要创建的目录名称,mode为新目录的权限,成功返回0否则-1。
int rmdir(char* path):删除成功返回0否则-1。
调用chdir或者fchdir可以变更当前工作目录:int chdir(path),int fchdir(int fd):fd为目录文件的文件描述符。0-1
char* getcwd(char * buf, size_t size):获取当前工作目录,buf用于保存当前工作目录。成功返回当前目录名称,失败返回NULL。
136.读取目录
opendir readdir rewinddir closedir。rewind用于重定位目录的读指针。
标准IO库
137.文件操作是直接调用文件操作的系统调用(文件操作API)完成的,另外一种访问文件的方式:标准输入输出库,其是在系统调用基础上进行封装的。使用系统调用访问文件系统是针对文件描述符进行的,而使用标准I/O库时,操作的是“流”对象,打开文件成功后系统内核返回流(stream)数据结构,接下来所有操作都是针对流进行。流是一个指向FILE结构的指针。标准IO是带缓存的,系统调用不具有缓存机制。
138.缓存:在进行文件IO操作时,对数据的读写并不直接对文件系统进行,而是对缓存进行。缓存空间满时,由系统根据缓存的内容刷新到文件系统。(缓存必考)
139.三种提供缓存的方式。缓存是在第一次调用标准库进行IO操作时系统自动调用malloc分配的。全缓存:当前IO操作的缓存被填满时才会向文件系统进行刷新。行缓存:输入输出过程中如果遇到换行符,则进行刷新,行读写函数和向标准输出输出信息都是行缓存。不缓存:如标准错误输出。系统调用fflush可以进行手工刷新。
输出为:
第一条语句由于是行缓存,没遇到换行符没法输出,所以先输出第二句。第一条信息接收到换行符后才输出,并显示换行符。
140.改变流的默认缓存方式(必考)
setbuf setbuffer setlinebuf setvbuf,setlinebuf用于设置某个流为行缓存模式。setbuf(stdout, NULL):将标准输出设置为无缓存模式。
141.标准输出的重定向
程序从键盘读取stdin,将向stdout和stderr输出的信息显示到屏幕上,如果要改变这种默认的输入输出方式,则需要重定向:将默认的输出输出的目标定向到新的目标。新目标可以是某个设备或者文件。shell下进行输入重定向的符号是<,输出重定向是> >>,后者是附加方式。如ls > /tmp/a,将ls输出到a文件中(覆盖)。
dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接。dup()与dup2()能对输入文件描述符进行重定向。(必考)
142.打开或者关闭流文件
file* fopen(filename, modes), int fclose(file* stream):modes为文件打开方式。fopen返回NULL表示失败,否则返回流指针。fclose返回EOF表示调用失败,否则返回0。
143.单字符的读写(考)
int fgetc(file* stream)、int getc(stream),返回EOF表示读失败,其他:读取到的字符。
int putc(int c, stream), fputc:向流中写入的字符为c。EOF表示写失败,否则返回写入的字符。
getchar putchar等价于getc(stdin)与putc(c, stdout)。
144.从文件中读写一行
fputs与fgets。
145.格式化输入输出
146.二进制方式读写
写入文件后序列化,读出后再反序列化:fread和fwrite。
size_t fread(ptr, size, n, stream):ptr存储读取的内容,size为要读取的每个记录的长度,n为要读取的记录个数,stream为流指针。返回0表示调用失败。成功返回记录个数。
size_t fwrite(同上)。
147.在流文件中定位
fseek、ftell以及rewind。
148.不建议将系统调用和标准输入输出函数混合使用,原因是:缓存!
149.进程的定义
150.每个进程都有唯一的标识号——PID。进程可以产生新的进程,构成父子关系。
151.进程的用户标识和有效用户标识
152.一个进程属于且仅属于一个进程组,项进程组发送信号,组内所有进程都收到。
153.会话
154.获取进程的属性:
getpid:获取进程ID;getppid:获取进程的父进程ID;getpgrp:获取进程的进程组ID;getuid:获取进程的真实用户ID;getgid:真实用户组ID;geteuid:有效用户ID;getegid:有效用户组ID。(有效和真实,真实为调用该进程的用户ID)。
155.考:前台作业放到后台执行,应该先挂起:
156.更改用户归属的组:setpgid(pid, gid)
157.一个会话可以包含多个进程组,但是只能有一个前台控制组,其他为后台运行进程组,前台进程组通过组长进程与控制终端相连。会话ID是会话首进程ID。setsid用于产生一个新的会话。
158.传统的Linux终端是RS232串口通信协议的串口终端。(考tty)
tty命令查看当前终端的名称:
159.当控制终端被关闭时,控制终端所关联的进程将收到SIGHUP信号。
160.ps -aux考其中一个:ps -aux:显示所有包含其他使用者的进程。ps -ef 是用标准的格式显示进程的。
161.进程状态之僵尸状态:如何生成?有啥危害?哪两种解决办法?
除PID为0的进程外,其余所有进程都有父进程。僵尸状态:表示进程结束但未消亡的一种状态。进程在退出前会给父进程发送SIGCHLD信号,父进程调用wait为子进程的退出做首尾工作。如果父进程未进行此工作,则子进程虽然退出,但通过执行ps命令仍可以看到该进程,其返回值还在pcb中。
危害:如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。此即为僵尸进程的危害,应当避免。即:占用进程表空间,影响整个系统的效率。
两种解决办法:
一是父进程显式忽略SIGCHLD信号:调用signal(SIGCHLD, SIG_IGN)即可。
二是在SIGCHLD信号处理函数中获取子进程的退出状态。
162.孤儿进程:没有父进程的进程,init接管。
产生原因:一个父进程退出,而他的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。
危害:每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。因此孤儿进程并不会有什么危害。
163.进程优先级
优先级=优先级别PR+谦让值NI。其中PR不能改变。系统调用nice可以将进程的默认谦让值从0改大,或改小(root才行)。rnice修改正在执行的进程的谦让值。setpriority和get。rnice调整的是已经开启的进程优先级,而nice是直接在开启时变定义了优先级。
164.真实完整的main
argc表示执行程序时命令行参数个数,如果未输入参数则为0。argv命令行参数数组,每一个数组成员为一个命令行参数,程序名称是argv[0]。env:环境变量数组。
165.获取命令行参数
在编程过程中可以直接访问argv[0…]来获取命令行参数,此外也可以使用getopt。
int getopt(int _argc, char* const* _argv, char* _shortopts)。argc和argv都是main函数的参数,shortopts是选项字符串,指定了解析命令行参数的规则。getopt认可的命令行选项参数是通过”-”进行的。如ls -a。在该参数中,如果某个选项有输入数据,则该选项字符的后面应包含:,如ls -l ./a命令在指定本参数时应该使用l:。如果该参数第一个字符是:,则getopt发现无效参数时并不返回失败,而是返回?表示无效,返回:表示需要输入选项值。
optstring是选项字母组成的字串。如果该字串里的任一字符后面有冒号,那么这个选项就要求有选项参数。
比如执行一个程序:./test_program -i -s abc -t,abc是-s选项的参数。
函数返回值:?:表明返回一个未在shortopts定义的选项。:表示该选项需要输入参数但是并未输入。-1表示getopt已经解析完毕,后面已经没有选项。其他:返回的选项字符,如hvo等。
相关全局变量:optind:整型变量,存放argv当前的索引值。optarg:字符串指针,当处理一个带有选项值的参数时,里面存放该选项的值。optopt:整型变量,发现无效选项(返回?或者:)时包含当前无效选项。opterr设置为0则报错时不输出任何信息。
166.全局的环境变量:etc/profile
getenv(name),setenv(“name=5”)。
167.内存分配:ulimit -s
168.进程的创建必考
fork()调用后生成新的进程。
调用fork一次将返回两次:在父进程中返回值为子进程的进程标识符。子进程中返回0。
169.exec系列函数
填空题:并不创建新的进程,调用前后的进程ID相同,其主要工作是清除父进程的可执行代码映像,用新进程的代码覆盖调用exec的进程代码。
170.system创建进程。
171.exit退出进程,一般不使用_exit。
172.一个进程退出时将向其父进程发送SIGCHLD信号,父进程收到后可以忽略,如果要处理则需要调用wait系列函数,其作用是等待子进程退出,并获取子进程的返回码。如果调用wait后没有任何子进程退出,则父进程将进入阻塞状态。wait或者waitpid返回-1表示调用失败,否则返回子进程ID。
173.信号产生的几种常见原因
174.shell中输入kill -l可以获取全部信号的列表:
SIGHUP:该信号是在进程的控制终端注销时产生,发往该终端上运行的所有进程。
SIGINT:程序终止信号。按下ctrl+c产生该信号。
SIGTERM必考:进程结束信号。该信号可以被用户捕捉并处理,shell下执行kill发送该信号。
SIGKILL必考:终止用户进程的执行信号。该信号不能被忽略,一旦收到必须终止,shell下执行kill -9发送该信号。
SIGSTOP必考:同SIGKILL,执行kill -19。
SIGCHLD必考:子进程退出信号,子进程退出时向父进程发送该信号。子进程没有显式忽略该信号也没有处理,则形成僵尸进程。
175.信号的三种处理方式:忽略信号、按照系统提供的缺省处理规则进程、程序中自己定义处理函数(安装信号处理函数)。除了SIGSTOP和SIGKILL不能被忽略,其他都可以。
176.安装信号处理函数
通过系统调用signal或者sigaction完成。
必考signal函数写法:
sugnum:信号名称。handler:指向信号处理函数的指针,用于指定处理函数。除了自定义外:SIG_DFN表示缺省处理规则,SIG_IGN表示忽略该信号。返回SIG_ERR表示安装失败,否则返回原信号处理函数指针。
177.进程间通信机制(必考)
哪六种通信机制?(附上解释)
(1)管道:用于具有亲缘关系的进程(父子进程)间的通信。
(2)信号:用于通知进程有某种事件发生。
(3)消息队列:进程向消息队列中发送某种类型的消息,也可以从中读取,内容自定义。
(4)共享内存:读写效率最高的一种方式,在系统内核分配一块缓冲区,多个进程都可以访问该缓冲区。
(5)信号量:主要用于进程间的同步。
(6)套接字:用于跨越主机边界的通信。
178.消息队列、共享内存、信号量3种机制合并起来称为进程间通信IPC。
179.管道特点
180.管道分类
普通管道:
命名管道:位于文件系统内
181.创建普通管道
使用pipe函数:int pipe(pipedes[2]):创建后第一个成员是用于读的文件描述符,第二个是写。返回0表示创建成功,-1表示失败。
182.简化版的普通管道
183.命名管道
在shell中创建命名管道:(必考mknod和mkfifo)
创建:mknod 管道名称 p;此外mkfifo -m 权限 管道名称 也可以创建,权限指创建成功后的管道文件的权限。
C语言中使用mkfifo:
184.命名管道的打开与删除
打开open删除unlink。
185.IPC对象一经创建,会分配相关数据结构。系统的IPC控制命名:查看IPC的ipcs和删除IPC对象的ipcrm。
186.为区别不同进程间通信的对象,每个IPC对象都有一个名字,称为键(32位长整型),系统内唯一。
187.键值生成函数ftok
188.消息队列的相关函数(创建删除等,可能考)
msgget创建、msgsnd消息发送、msgrcv消息接收、msgctl消息控制
考点整理
1.文件系统的自动挂载文件配置文件?/etc/fstab。
2.函数库的链接,动态与静态。文件链接分为硬链接和符号链接,硬:链接文件与被链接文件物理上是同一个文件,对文件进行硬链接后只是增加了文件的引用计数,并没有在物理上增加文件。通过执行ln命令产生硬链接,ln -s符号链接(快捷方式,软链接)。
3.文件类型考察:普通文件-,目录文件d、字符设备文件c、块设备文件b、软链接文件l、管道文件p。设备文件:方便Linux访问外部设备。链接文件:指向一个真实存在文件的链接,快捷方式。管道文件:用于不同进程间的信息传递。
4.文件权限的考察:
5.管道是命令间,文件间是重定向。
6.汇编选项-S,转成汇编语言,6263两条。二进制模块:-c,预处理-E,调试信息-g。
7.文件重命名与拷贝:重命名mv,拷贝cp
8.第二块硬盘第二个主扇区:/etc/sdb2,第二个逻辑分区/dev/sdb6。
9.Linux中默认shell:bash
10.stdout和stdin都是行缓冲,stderr无缓冲。fopen打开的普通文件默认是全缓冲。
11.动态函数库的编译指定-fPIC选项,链接指定-shared选项。
12.make工具:CFLAGS环境变量指定C语言编译器参数;LDFLAGS指定C语言链接器参数。CPPFLAGS指定C语言的预编译参数。c++的编译选项:CXXFLAGS。CXX:c++编译器的名字。
13.vi移到下一个单词的开始处:w;删除当前光标处单词:dw。(必考)
14.生成新的进程fork。
15.安装新的信号处理函数:signal函数(怎么写)
16.解析:getopt。
17.启动一个进程时修改默认nice和已经启动rnice。
18.文件状态获取stat,文件系统状态获取statfs。到这里:12:48
19.$?执行上一个命令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
20.>覆盖重定向,>>追加重定向。
21.SIGKILL和SIGSTOP不可忽略。
22.新建文件的默认权限:666 & ~UMASK(022)。110 110 110 & (111 101 101)=110 100 100,rw-r–r–。
23.PS1 PS2 HOME:PS1用于修改shell终端的提示符。
24.非空目录删除rm -rf。r递归,f强制
25.文件系统卸载umount。
26.环境变量的导出export。
27.mount -a选项(填空题:-a)
28.kill默认发送SIGTERM。
29.执行脚本文件source命令,不需要w需要r和x,如果没有x可以通过source命令。
30.并口:hda hdb,串口sda sdb。
31.2 > &1的含义:2>&1 的意思就是将标准错误重定向到标准输出,这里标准输出已经重定向到了/dev/null。那么标准错误也会输出到/dev/null。
32.显示所有用户的所有进程:ps命令,考-aux。
ps -a 显示现行终端机下的所有进程。ps -u以用户为主的格式来显示进程情况,即显示指定用户的进程。ps -x:显示所有程序,不以终端机来区分,未连接到终端的进程也显示。
33.发信号:kill -15 78,将信号15发给进程78,或者kill -78:将SIGTERM发送给78号进程。
34.新添加硬盘的步骤:fdisk创建分区->mkfs格式化,创建文件系统->mount挂载文件系统。root用户才能发SIGKILL和SIGSTOP。
35.尾行模式下保存并退出命令(:wq)。
36.安装编译软件:第一步:./configure;第二步:make;第三步:make install(需要root权限)
37.6个中进程间通信方式。
38.僵尸进程和孤儿进程。
39.makefile的书写必考:第一行目标依赖项,第二行起始为tab键,写bash命令指定如何从依赖项生成目标:考察有库函数的。
40.函数库static和shell。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。