题目
作答
24.1
盲猜8个,编个程序测一下哈
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
fork();
fork();
fork();
printf("PID = %d\n", getpid());
}
输出如下:
24.2
我们首先要明白fork和vfork的区别:
- 无需为子进程复制虚拟内存页或页表。相反,子进程共享父进程的内存,直至其成功执行了 exec()或是调用_exit()退出。
- 在子进程调用 exec()或_exit()之前,将暂停执行父进程。
系统是在内核空间为每个进程维护文件描述符表,且在 vfork()调用期间将复制该表,所以子进程对文件描述符的操作不会影响到父进程。
代码如下:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
if(vfork() == 0)
{
close(STDOUT_FILENO);
while(1);
}
else
{
while(1); //不用也可以,因为父进程会被暂停,直至子进程exce
}
}
然后通过 ps aux 指令找到这两个进程的PID。
查看/proc/PID/fd中的已打开文件描述符表
能够发现这二者的不同。