操作系统导论第五章习题

第五章作业1,2,4

第一题

1.调用fork函数,观察子进程和父进程中的变量的值的变化。
使用虚拟机,编写一个程序,调用fork()系统函数,编译之后执行这个文件,检查分析得到的结果。
程序如下:
操作系统导论第五章习题

执行结果:
操作系统导论第五章习题

结果分析:
编译之后,直接执行,调用fork()函数时,程序由父进程拷贝了一个子进程,子进程不会从main()入口开始执行,而是直接从fork()系统调用开始,父进程获得的返回值是子进程的pid值,大于0,子进程获得的返回值是0,所以根据rc得到的值可以判断fork()函数的操作。
x变量是全局变量,设置为整数值100,父进程改变x的值为0,子进程不改变,fork()操作之后子进程中x依然为100,父进程为0。
子进程父进程改变x的值:
操作系统导论第五章习题
操作系统导论第五章习题

分别在子进程和父进程中改变x变量的值,最后输出的结果也对应改变。

第二题

2.fork()调用创建一个新进程,通过子进程和父进程来访问open()返回的文件描述符。
代码编写:
操作系统导论第五章习题

执行结果:
操作系统导论第五章习题

直接编译的话看不到具体的过程,只能看到fork()之前的操作,所以使用cat p2.output指令来观看所有的输出结果。
先调用fork创建一个新的进程,然后是open()打开对应的执行文件,通过父进程和子进程来访问open()返回的文件描述符,根据输出文件的结果,只有子进程可以访问这个过程,父进程不能。同时可以它们两个都可以写入文本。

第四题

4.调用fork()程序,然后调用exec()来运行程序/bin/ls,尝试不同的exec的变体。
代码实现:
操作系统导论第五章习题

结果分析:
操作系统导论第五章习题

尝试所有的变体之后,再调用系统文件中的程序,编译运行之后,每一条输出都有两次,它记录的是home下面的所有文件的保存,推测是系统保存文件的日志。