UNIX期末总复习
(1)什么是操作系统?什么是UNIX操作系统?什么是Linux操作系统?它们之间的关系是怎样的?
操作系统:控制计算机硬件和软件资源,对作业进行合理的调度,以供用户方便使用的一组软件的集合。
UNIX操作系统,是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统。
Linux,即GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
Linux继承了Unix以网络为核心的设计思想,它能运行主要的UNIX工具软件、应用程序和网络协议。
操作系统分为两大阵营 一边是windows 一边是unix linux是一种unix-like操作系统
(2)程序运行时,堆栈如何变化?什么是数据帧或活动记录?bp和sp指针在函数运行过程中是如何变化的?
https://blog.csdn.net/fang92/article/details/46494665
bp:栈帧指针,具体应该是指向当前函数栈的栈底,是不动的。实际的作用应该就是类似于一个基址,通过这个基址上栈中变量的寻址。
sp:栈顶指针。
(3)UNIX环境下编程共同遵循的规范有哪些?“Least Surprise”是什么意思?
ISO C
IEEE POSIX
Single UNIX Specification
Least Surprise:在设计界面的时候,尽量做最少的surprise thing
(4)常用的Shell命令,如ls、cd、dd、pwd、ps、cp、chown、chmod、mkdir、size等的具体用法。
- ls
[root@localhost ~]# ls -a #列出所有文件
[root@localhost ~]# ls -A #列出所有文件但不包括表示当前目录.和上级目录..这两个文件。
[root@localhost /]# ls -clt #和 -lt参数一起使用,以时间排序
[root@localhost /]# ls -cl #和-l参数一起使用,以文件名排序并显示时间
[root@localhost /]# ls -d /home #仅列出/home目录本身
[root@localhost /]# ls -l #列出长数据串,显示出文件的属性与权限等数据信息(常用)
- cd
[root@localhost ~]# cd #直接进入个人目录
[root@localhost ~]# cd destination #进入到目标目录
- dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
[root@localhost ~]#dd if=/root/1Gb.file bs=64k | dd of=/dev/null #测试写的速度
/dev/null 外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
/dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0!
- pwd
zhuzhu@zhuzhu-ThinkPad:~$ pwd
/home/zhuzhu
-
ps(Process Status)查看Process的详细状态
[root@localhost ~]# ps -a #列出当前终端机的所有进程 [root@localhost ~]# ps -A #列出所有进程
cp(copy)拷贝文件
[root@DB-Server kerry]# cp file1 file2 #拷贝文件file1到当前目录并更名为file2
[root@DB-Server ~]# cp /home/kerry/* /tmp 拷贝kerry目录下文件到tmp目录下
-
chown
chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限。
[root@localhost test6]# chown 拥有者:群组 filename
-
chmod
r=4,w=2,x=1
若要rwx属性则4+2+1=7; 若要rw-属性则4+2=6; 若要r-x属性则4+1=5。
[root@localhost test6]# chmod ug=rwx,o=x file
- mkdir
[root@localhost test6]#mkdir test #创建一个空目录
[root@localhost test6]#mkdir -m 777 test3 #创建一个权限为777的目录
- size
(5)什么是管道?哪些文件参与了管道?在命令行下和通过编程如何实现管道?
https://blog.csdn.net/oguro/article/details/53841949
管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:
其本质是一个伪文件(实为内核缓冲区)
两个文件描述符引用,一个表示读端,一个表示写端。
规定数据从管道的写端流入管道,从读端流出。
管道的局限性:
① 数据自己读不能自己写。
② 数据一旦被读走,便不在管道中存在,不可反复读取。
③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。
④ 只能在有公共祖先的进程间使用管道。
命令行 : command 1 | command 2 | command 3 ……
在linux中有些命令可以直接用于管道命令中,有些则不可以,对于不可以直接用于管道的命令需要借助xargs命令:
find ./ -type f | xargs md5sum >> md5_rc1.txt
find ./ -type f -print| xargs md5sum >> md5_rc1.txt
find ./ -type f -print0| xargs -0 md5sum >> md5_rc1.txt
而对于可以直接用于管道的命令,不需要xargs直接写就可以,直接写在管道符后面就能判断,例如要确定wc命令是不是可以直接用于管道的命令
ls -l | wc -l
对于常用的可以直接用于管道的命令,主要有:
cut
grep
sort
uniq
wc
tee
tr
col
join
paste
expand
xargs
编程:pipe函数
创建管道
int pipe(int pipefd[2]); 成功:0;失败:-1,设置errno
函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] → r; fd[1] → w,就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。
管道创建成功以后,创建该管道的进程(父进程)同时掌握着管道的读端和写端。如何实现父子进程间通信呢?通常可以采用如下步骤:
父进程调用pipe函数创建管道,得到两个文件描述符fd[0]、fd[1]指向管道的读端和写端。
父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。
父进程关闭管道读端,子进程关闭管道写端。父进程可以向管道中写入数据,子进程将管道中的数据读出。由于管道是利用环形队列实现的,数据从写端流入管道,从读端流出,这样就实现了进程间通信。
(6)常规文件和目录文件的差别是什么?常规文件、目录文件、软链接文件的长度如何计算?
普通文件:存储普通数据,一般就是字符串。
目录文件:存储了一张表,该表就是该目录文件下,所有文件名和inode的映射关系。
从父目录中获得本文件的inode号---->找到inode-table表中找到这个inode号对应的数据域中的起点以及其他信息---->去这个数据域中读取该文件的内容(普通文件的内容一般是字符串,目录文件的内容是一张表)
关键就是访问任何一个文件,要看是否能搞到inode号,搞不到就没辙了。搞到inode就好说了,拿着inode号去inode表中查找即可,最后找到数据域,那么就可以找到文件的内容了 然后整个过程这不仅仅跟本文件权限有关,还跟它的父目录(还有父目录的父目录...)权限有关(是否能搞到本文件的inode)
体现在命令上:(话说这才是最实际的表象)
======
对于普通文件来说,rwx的意义是: r:可以获得这个普通文件的名字和内容。 w:可以修改这个文件的内容和文件名。可以删除该文件,但是用户会得到是否删除写保护文件的prompt。 x:该文件是否具有被执行的权限。 ======
对于目录文件来说,rwx的意义是: r-x:可以进入cd该目录,可以获得该目录下存储情况,但是不能修改这个目录内部存储的文件(目录)的名字,也不能在该目录下新建文件和目录 -wx:可以进入cd该目录,但是看不到该目录下的存储情况(ls不可用),可以往该目录下添加、修改、删除文件。可以通过cat来读取该目录下的文件or目录的内容,由于得不到该目录下存储了那些文件,在不知情的情况下只能通过猜,cat + 文件名获得文件内容,所以这样依然不保密。 --x:可以进入cd该目录,看不到存储情况,也不能往该目录下添加、修改、删除文件。但是依然可以通过cat + xx(猜)来获得该目录下的文件的内容。 rw-:不能进入cd该目录,用ls仅仅可以获得文件名和目录名,因为获取不到这些文件的inode号,当然也不能获得该目录下的文件的内容。不能往该目录下添加、修改、删除文件。
======
https://blog.csdn.net/mrjy1475726263/article/details/34436769
查看长度的话可以使用lseek函数来进行操作
(7)怎样移动文件?在命令行方式下和通过编程如何实现?
命令行:
[root@localhost test6]#mv [-fiv] sourefile destination
参数说明:
-f:force,强制直接移动而不询问
-i:若目标文件(destination)已经存在,就会询问是否覆盖
-u:若目标文件已经存在,且源文件比较新,才会更新
例子:将/test1目录下的file1复制到/test3目录,并将文件名改为file2
[root@localhost test6]#mv /test1/file1 /test3/file2
编程:作业1
通过read和write来实现拷贝文件
(8)怎样利用gcc编译源文件?gcc的-o、-e、-static、-Wall等选项的具体含义是什么?怎样使用?
http://www.cnblogs.com/qytan36/archive/2010/05/25/1743955.html
[root@localhost test6]#gcc [-fiv] test.c
参数说明:
-o:指定生成的输出文件;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-wall:显示警告信息;
将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。
gcc test.c -o test
将test.c预处理输出test.i文件。
gcc -E test.c -o test.i
将预处理输出文件test.i汇编成test.s文件。
gcc -S test.i
将汇编输出文件test.s编译输出test.o文件。
gcc -c test.s
多源文件的编译方法
多个文件一起编译
gcc testfun.c test.c -o test
分别编译各个源文件,之后对编译后输出的目标文件链接。
gcc -c testfun.c #将testfun.c编译成testfun.o
gcc -c test.c #将test.c编译成test.o
gcc -o testfun.o test.o -o test #将testfun.o和test.o链接成test
(9)什么是动态链接库?什么是静态链接库?怎样用静态链接的方式编译C程序?
静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。
有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。
gcc -static
(10)什么是文件系统?UNIX的文件系统有什么特点?有哪些具体的文件类型?
文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。 Unix可以把一个能随机存取的存储介质(如:硬盘、软盘和光盘)上的存储空间划分成一致多个区域,每个区域都可以像独立的物理设备一样单独进行管理和数 据存取,这样的存储区域,即是逻辑设备。在逻辑设备上按照一定的格式进行划分,就构成了逻辑文件系统,简称文件系统。
普通文件 这种文件包含了某种形式的数据,这些数据无论是文件还是二进制对于 UNIX 内核而言都是一样的。对普通文件内容的解释有处理该文件的应用程序进行。
目录文件 目录文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读权限的任一进程都可以读取该目录的内容,但是只有内核才能直接写目录文件。
块特殊文件 这种文件类型提供对设备带缓冲的访问,每次访问以固定长度为单位进行。
字符特殊文件 这种文件类型提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。
FIFO 这种类型文件用于进程间通信。也称为命名管道(namedpipe)。
套接字(socket) 这种文件类型用于进程间的网络通信。
符号链接(symbolic link) 这种文件类型指向另一个文件。
(11)什么是文件的访问权限?使用chmod命令怎样改变访问权限?chmod 0777是什么意思?
在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录 chmod [mode] 文件名(其中mode可用二进制数表示) u :目录或者文件的当前的用户 g :目录或者文件的当前的群组 o :除了目录或者文件的当前用户或群组之外的用户或者群组 (u) (g) (o)
— = 0 rwx = 7 0777–>-rwx rwx rwx 对所有用户开放所有权限
(12)什么是文件操作是的偏移量(offset)?它的数据类型是什么?操作系统中文件的最大长度取决于什么?
https://blog.csdn.net/MonroeD/article/details/52771027?locationNum=10
每个打开的文件都有一个与其相关联的“当前位移量”,它是一个非负整数,用于度量从文件开始处计算的字节数,通常,读写操作都从当前文件位移量开始,并使位移量增加所读或所写的字节数。按系统默认,当打开一个文件时,除非指定O_APPEND选项,否则该位移量被设置为0,注意lseek函数只修改文件的当前位移量,没有进行任何I/O操作,文件位移量可以大于文件的当前长度
空洞文件?、
取决与offset的位数?
(13)什么是管道?什么是文件重定向?dup()、dup2()函数怎样使用?
管道:UNIX操作系统进程间通信的一种方式,一个进程的输出直接传递到另一个进程作为输入
文件重定向 :在linux中重定向用符号“>”表示,语法一般是 源文件 > 目标文件
https://blog.csdn.net/u011541946/article/details/71698645
int dup(int oldfd);
int dup2(int oldfd, int newfd);
两个函数的作用 复制一个现存的文件描述符。
当调用dup函数时,内核在进程中创建一个新的文件描述符,此描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。
dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项。
实际上,调用dup(oldfd)等效于,fcntl(oldfd, F_DUPFD, 0)
而调用dup2(oldfd, newfd)等效于,close(oldfd);fcntl(oldfd, F_DUPFD, newfd);
(14)什么是文件的静态属性和动态属性(文件描述符属性)?在文件描述符属性中,哪些是由进程维护的?哪些是由内核维护的?
图解
理解具体情况,需要了解由内核维护的3个数据结构:
进程级文件描述符表(file descriptor table) 系统级打开文件表(open file table) 文件系统i-node表(i-node table) 这3个数据结构之间的关系如下图所示:内核使用三种数据结构表示打开的文件,分别是文件描述符表、文件表和 V 节点表。 (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每个描述符占用一项。与每个文件描述符相关联的是: (a) 文件描述符标志。 (b) 指向一个文件表项的指针。 (2) 内核为所有打开文件维持一张文件表。每个文件表项包含: (a) 文件状态标志(读、写、添写、同步和非阻塞等)。 (b) 当前文件偏移量。 (c) 指向该文件 V 节点表项的指针。 (3) 每个打开文件(或设备)都有一个 v 节点(v-node)结构。v 节点包含了文件类型和对此文件进行各种操作的函数的指针。v 节点还包含了从磁盘读取的 i 节点(i-node)的信息,i 节点信息包含了文件的所有者、文件长度、文件所在的设备、指向文件的实际数据块在磁盘上的所在位置的指针等。
参考链接:
(15)什么是会话(Session)、进程组?它们之间有什么关系?
进程组是一个或多个进程的集合,通常它们与一组作业相关联,可以接受来自同一终端的各种信号。每个进程组都有唯一的进程组ID(整数,也可以存放在pid_t类型中)。 会话是一个或多个进程组的集合。
每个进程组都有一个组长进程,组长进程的标识是进程组ID等于其进程ID。
进程调用setsid函数创建一个新的会话,该进程会变成新会话的会话首进程,该进程也成为一个新进程组的组长进程。如果此调用进程已经是一个进程组的组长,则此函数返回出错。 调用getsid函数返回调用进程的回话首进程的进程组id。
(16)父进程和子进程之间是什么关系?怎样在父子进程之间共享文件描述符?
由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。将子进程id返回给父进程的理由是:因为一个进程的子进程可以多于一个,没有一个函数使一个进程可以获得其所有子进程的进程id。对子进程来说,之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid;也可以调用getppid()来获取父进程的id。(进程id 0总是由交换进程使用,所以一个子进程的进程id不可能为0 )。 fork之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,子进程拥有父进程当前运行到的位置(两进程的程序计数器pc值相同,也就是说,子进程是从fork返回处开始执行的),但有一点不同,如果fork成功,子进程中fork的返回值是0,父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。可以这样想象,2个进程一直同时运行,而且步调一致,在fork之后,他们分别作不同的工作,也就是分岔了。这也是fork为什么叫fork的原因 至于那一个最先运行,可能与操作系统调度算法有关,而且这个问题在实际应用中并不重要,如果需要父子进程协同,可以通过原语的办法解决。
父子进程共享文件描述符的条件:在fork之前打开文件。
如何共享文件描述符:父子进程共享文件描述符- 洋羽翔
(17)在一个进程中,文件描述符的增长规律是怎样的?例如,如果已经有0、1、2、6这样几个文件描述符,那么用open()返回的下一个文件描述符是什么?
- 由open和openat函数返回的文件描述符一定是最小的未用描述符数值
3
(18)什么是process id?父进程和子进程的pid之间有什么关系?(通常子进程的pid要大于父进程的pid)
process id:进程标识符,unix系统中用来唯一标识每个进程,是一个非负整数。
子进程总是可以调用getppid来获得父进程的pid,父进程在调用fork函数时可以获得子进程的pid.
(19)什么是C语言程序的入口函数?在C Startup Routine(start.S)中接受的main函数原型是什么?
Main函数。(当内核执行C程序时,在调用main前先调用一个特殊的启动例程,可执行程序文件将此启动例程设置为程序的起始地址。启动例程从内核取得* 命令行参数和环境变量值,然后为按上述方式调用main函数做好安排。)
Int main(int argc, char * argv[1]),argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组。
(20)什么是系统调用?什么是C语言库函数?它们之间有什么区别和联系?
系统调用(system call),指运行在用户空间的应用程序向操作系统内核请求某些服务的调用过程。 系统调用提供了用户程序与操作系统之间的接口。一般来说,系统调用都在内核态执行。由于系统调用不考虑平台差异性,由内核直接提供,因而移植性较差(几乎无移植性)。
库函数(library function),是由用户或组织自己开发的,具有一定功能的函数集合,一般具有较好平台移植性,通过库文件(静态库或动态库)向程序员提供功能性调用。程序员无需关心平台差异,由库来屏蔽平台差异性。
系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api.
采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四:让api也可以有了级别和专门的工作面向。
(21)什么是inode?里面存放什么信息?文件的文件名存放在哪里?
inode(index node)就是索引节点,它用来存放档案及目录的基本信息,包含时间、档名、使用者及群组等。inode信息就存储在磁盘的某个分区上 inode 包含文件的元信息,具体来说有以下内容: * 文件的字节数 * 文件拥有者的 User ID * 文件的 Group ID * 文件的读、写、执行权限 * 文件的时间戳,共有三个:ctime 指 inode 上一次变动的时间,mtime 指文件内容上一 次变动的时间,atime 指文件上一次打开的时间。 * 链接数,即有多少文件名指向这个 inode * 文件数据 block 的位置 可以用 stat 命令,查看某个文件的 inode 信息: stat example.txt 总之,除了文件名以外的所有文件信息,都存在 inode 之中。
(22)C程序的内存布局是怎样的?从低地址到高地址依次存放哪些段?
正文段:由CPU执行的机器指令部分。
初始化数据段:程序中需明确地赋初值的变量。
非初始化数据段:在程序开始执行之前,内核将此段中的数据初始化为0或空指针。
栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。
堆:通常在堆中进行动态存储分配。 从低地址到高地址依次存放正文,初始化的数据,未初始化的数据(bss),堆,栈。
参考链接:
(23)怎样利用fork()、exec()、waitpid()来创建和控制进程?
1.fork 函数调用一次,但返回两次。两次返回的唯一区别是:子进程返回值为 0,而父进程的返回值是新子进程的进程 ID。fork 函数返回之后,子进程和父进程都各自继续执行 fork 调用之后的指令。子进程是父进程的副本。例如,子进程获得了父进程数据空间、堆和栈的副本。 2.当进程调用一种 exec 函数时,该进程执行的程序完全替换为新程序,而新程序则从其 main 函数开始执行。调用 exec 并没有创建新进程,所以进程 ID 没有改变,exec 只是用一个新的程序替换了当前进程的正文、数据、堆和栈段。 3. waitpid 函数通过 pid 参数来控制父进程希望获取特定进程的终止状态信息, • pid==-1:等待任一子进程,与 wait 函数等效。 • pid>0:等待其进程 ID 与 pid 相等的子进程。 • pid==0:等待其组 ID 等于调用进程组 ID 的任一子进程。(我们这里不学习进程组) • pid<-1:等待其组 ID 等于 pid 绝对值的任一子进程。 waitpid 函数返回终止子进程的进程 ID。如果指定的进程或进程组不存在,或者参数 pid 指定的进程不是调用进程的子进程则都将出错。
(24)什么是孤儿进程、什么是僵尸进程?它们有什么特点?怎样避免产生过多僵尸进程?
孤儿进程:在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。 僵尸进程:在UNIX术语中,一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程。 1.终止进程的父进程调用wait和waitpid 2.两次调用fork()来使新创建的子进程变成孤儿进程,从而直接被1号进程收养。
(25)什么是前台进程?什么是后台进程?一个会话有几个前台进程组和几个后台进程组?
前台进程:用户使用的有控制终端的进程。 后台进程:也称守护进程,是运行在后台的一种特殊进程。独立于控制终端并且周期性地执行某种任务或者等待处理某些发生的事件。 一个会话中包含一个前台进程组,一个或多个后台进程组。
(26)C程序如何退出并返回操作系统?exit()函数和exit()/Exit()函数的差别在哪里?
进程的终止方式有 8 种,其中 5 种为正常终止,它们是 1. 从 main 返回。 2. 调用 exit。 3. 调用exit 或Exit。 4. 最后一个线程从其启动例程返回。 5. 最后一个线程调用pthread_exit。 另外三种为异常终止方式,它们是 1. 调用 abort。 2. 接到一个信号并终止。 3. 最后一个线程对取消请求做出响应。 这三个函数用于正常终止一个程序:exit 和Exit 立即进入内核,exit 则先执行一些清理处理(包括调用执行各终止处理程序,关闭所有标准 I/O 流等),然后进入内核。
(27)exec函数族包含哪些具体的函数?其中execve是系统调用,其它都是普通函数。
(28)什么是信号?SIGINT、SIGSTOP、SIGHUP、SIGALARM、SIGQUIT等信号是如何产生的?缺省的处理动作是什么?
在计算机科学中,信号是 Unix、类 Unix 以及其他 POSIX 兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。
SIGALRM 是闹钟信号,当由 alarm 函数设置的计时器超时后产生此信号。进程的信号屏蔽字复原为调用信号处理屏蔽字之前。
SIGQUIT,当用户在终端上按退出键(一般是Ctrl+\)时,中断驱动程序产生此信号,并发送给前台进程组中的所有进程。
SIGSTOP,作业控制信号,用以停止一个进程,当用户在终端上按挂起键(一般是Ctrl+Z)时,终端驱动程序产生此信号。
SIGHUP,如果终端接口检测到一个连接断开,则将此信号送给与该终端相关的控制进程(会话首进程)。 SIGINT,当用户按中断键(一般是Delete或Ctrl+C)时,终端驱动程序产生此信号并发送至前台进程组中的每一个进程。
(29)什么是硬链接和软链接(符号链接)?读取软连接的函数是什么?(readlink)
硬链接:通过 i 节点链接使多个目录项指向同一个文件的这种链接类型。
符号链接:对一个文件的间接指针,一般用于将一个文件或整个目录结构移到文件系统中的另一个位置。 readlink 函数打开符号链接本身,并读取该链接中的内容(不是该链接所引用的文件的内容)。
(30)函数link()和unlink()的作用是什么?什么时候文件占用的磁盘空间才会真正被释放掉?(两个条件)
Link():创建一个指向现有文件的链接;unlink删除一个现有的目录项。 打开文件的进程个数为0; 文件的链接计数为0。
(31)什么是可重入函数?怎样判断一个函数是不是可重入函数?
什么是可重入函数和不可重入函数(转) - Parry Nee - 博客园
一个可重入的函数简单来说,就是:可以被中断的函数。就是说,你可以在这个函数执行的任何时候中断他的运行,在任务调度下去执行另外一段代 码而不会出现什么错误。而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等等,所以他如果被中断的话,可能出现问题,所以这类函数是 不能运行在多任务环境下的。
基本上下面的函数是不可重入的 (1)函数体内使用了静态的数据结构; (2)函数体内调用了malloc()或者free()函数; (3)函数体内调用了标准I/O函数。
(32)什么是带缓冲的输出和不带缓冲的输出?当父进程的输出缓冲区还未清空时,调用fork创建子进程,会出现什么情况?
不带缓冲的输出:在用户的进程中对这这类的函数不会自动缓冲,每次执行就要进行一次系统调用,针对文件描述符操作。
带缓冲的输出:在系统调用的上一层多加了一个缓冲区,针对流来操作。
如果标准输出连接到终端设备,则它是行缓冲的,否则它是全缓冲的。即以交互方式运行时,只得到父进程中printf输出的行一次,原因是标准输出缓冲区由换行符冲洗。但是当将标准输出重定向到一个文件时,却得到printf输出两次,原因是在fork之前调用了一次printf,但当调用fork时,该行数据仍在缓冲区中,然后在将父进程数据空间复制到子进程中时,该缓冲区数据也被复制到子进程中,此时父进程和子进程各自有了该行内容的缓冲区。