1、在xsh2.c样例程序中,主循环结束前执行了close(fd[0])。如果省略了此操作,下面哪个说法正确?
A、管道读写端子进程都能正常运行结束并且完成预定的功能,但父进程文件描述符资源不能正常回收,多轮循环以后资源耗尽程序将无法完成预期功能
B、会导致管道读端子进程无法正常运行结束因而无法完成预定的功能
C、管道读写分别由两个子进程完成,父进程不关心管道操作,子进程完成操作后自然会关闭文件,因此这个操作完全可以省略
D、会导致管道写端子进程无法正常运行结束因而无法完成预定的功能
2、在xsh2.c样例程序中,主循环结束前执行了close(fd[1])。如果省略了此操作,下面哪个说法正确?
A、管道读写分别由两个子进程完成,父进程不关心管道操作,子进程完成操作后自然会关闭文件,因此这个操作完全可以省略
B、会导致管道读端子进程无法正常运行结束因而无法完成预期功能
C、会导致管道写端子进程无法正常运行结束因而无法完成预期功能
D、管道读写端子进程都能正常运行结束并且完成预定的功能,但父进程文件描述符资源不能正常回收,多轮循环以后资源耗尽程序无法完成预期功能
题目1和题目2是相似的问题,在xsh2.c中,主进程开了两个子进程,两个子进程之间实现通信,主进程的作用仅仅是创建两个子进程,它没有参与任何具体任务。
fd[0]、fd[1]分别是读和写
只有写端都关闭了,读才能返回。《解题核心》
第2题中,一个读进程,一个写进程,写进程写完之后,进程释放,但是由于主进程仍连着写端,导致读进程的读无法正常返回,读进程一直不释放,主进程的wait()就一直阻塞,导致了死锁,程序无法完成正常功能。
第1题,不关闭主进程的写,读写进程都可以正常释放,功能正常,for循环正常进行,不好的地方就是主进程每一次for都没有关闭读,文件描述符无法正常回收。
3、下面哪些C语言调用或者操作可能会导致进程收到信号?
A、pause
B、给数组元素a[i]赋值
C、条件运算
D、逻辑运算
数组越界,写了不可写的区域
4、两个进程,只有由共同祖先创建的匿名管道才可能用来实现两进程之间的通信,对于命名管道,没有这样的要求。
✔
课件原话
5、多个进程利用同一个管道向某一个进程发送数据,由于管道只允许一个发送端进程和一个接收端进程,所以无法实现这样的机制,但是可以通过多个管道实现,每个管道承载一个产生数据的进程的数据。
×
管道只允许一个发送端进程和一个接收端进程 这句话是错误的,可以实现一个写端,多个读端
6、Linux设计的非常健壮,尽管如此,多个进程利用管道通信也可能因操作不当产生死锁。
×
错略与机制分离的机制
7、在一个普通函数中,goto语句可以实现函数内部语句之间的跳转。全局跳转可以实现跨函数之间的跳转,但是只能跳转到本函数或本函数调用嵌套之外层函数的某一执行过的位置恢复运行。之前程序运行从这一位置到全局跳转前的这段时间里新诞生的局部变量都被销毁,但对全局变量的修改无法恢复。
√
这句话太长了,读一遍记忆一下得了。
8、进程设置捕获某信号后执行函数a,当进程处于阻塞状态时收到这个信号,进程将转去执行函数a,函数a执行完毕,进程将重返之前的阻塞状态,等待条件满足后退出阻塞状态。
×
进程不再回到阻塞状态,被唤醒之后,阻塞就被打断了,返回之后从阻塞之后开始执行。
9、进程设置捕获某信号后执行函数a,当进程正在执行用户态代码时收到这个信号,进程将转去执行函数a,函数a完成任务后,执行return语句返回,进程将重返之前中断处代码继续运行。
√
有的同学考虑函数a中有siglongjmp或exit之类的调用,的确就回不到之前中断处代码继续运行。这个考虑是对的,为了让题干更严谨些,特意强调了return语句返回。