Linux-UNIX系统编程手册:第24章 进程的创建【未完成】

213 阅读1分钟

题目

image.png

作答

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());
}

输出如下:

image.png

24.2

我们首先要明白fork和vfork的区别:

  • 无需为子进程复制虚拟内存页或页表。相反,子进程共享父进程的内存,直至其成功执行了 exec()或是调用_exit()退出。
  • 在子进程调用 exec()或_exit()之前,将暂停执行父进程。

系统是在内核空间为每个进程维护文件描述符表,且在 vfork()调用期间将复制该表,所以子进程对文件描述符的操作不会影响到父进程。

image.png

代码如下:

#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中的已打开文件描述符表

image.png 能够发现这二者的不同。

24.3