目录
Chapter 3 Process
例题:
1.Using the program shown in Figure 3.30, explain what the output will be at LINE A.
Answer:
输出为5
分析:创建了一个子进程,子进程复制了父进程的栈、堆等信息。
全局变量在子进程中改变不影响其在父进程中的值。(全局变量存储在数据段,属于初始化数据,子进程会复制父进程的初始化数据,两个进程是相互独立的)
2.Including the initial parentprocess,how many processesarecreated by the program shown in Figure 3.31?
Answer:
子进程创建过程如图,最终有8个进程。
3.When a process creates a new process using the fork() operation,
which of the following states is shared between the parent process and the child process?
a. Stack
b. Heap
c. Shared memory segments (内存段)
Answer:
只有Shared memory segments(共享内存段)是共享的,子进程将复制父进程的栈、堆、数据段。复制不等同于共享,如第一题,对各自的变量进行赋值等操作不会影响另一个进程。
Construct a process tree similar to Figure 3.8. To obtain process information for the UNIX or Linux system, use the command ps -ael.
Answer:
execlp()函数:从PATH环境变量中查找文件并执行。
execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名, 找到后便执行该文件, 然后将第二个以后的参数当做该文件的argv[0]、argv[1]……, 最后一个参数必须用空指针(NULL)作结束。
execlp("/bin/ls","ls",NULL) 这行的意思应该是调用bin目录下的ls命令(用该命令覆盖子进程地址空间)
这个函数执行后程序当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其 main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。有六种不同的exec函数可供使用,它们常常被统称为exec函数。这些exec函数都是UNIX进程控制原语。
所以直接执行该程序并不会打印”LINE J”,除非不执行execlp()函数。
我们将execlp("/bin/ls","ls",NULL)替换成execlp("/bin/ps","ps","-ael",NULL);可以在运行时得到如下结果(部分图示)
可以得进程树
4.Using the program in Figure 3.34,identify the values of pid at lines A,B, C, and D. (Assume that the actual pids of the parent and child are 2600 and 2603, respectively.)
Answer:
getpid()函数:返回当前进程pid
getppid()函数:返回父进程pid
A行:pid1 = 子进程pid (0)
pid = 创建子进程时的pid值---父进程pid
所以A行打印0
B行打印2600