本文主要是介绍进程标识和函数fork和函数和vfork(UNIX环境高级编程笔记),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
进程标识
每个进程都有一个非负整数表示的唯一进程ID。
虽然进程ID是唯一的,但是进程ID是可以复用的。
系统中有一些专用进程,但具体细节随着实现而不同。ID为0的进程通常为调度进程,常常被称为交换进程(swapper)。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也常常被称为系统进程。进程ID为1的通常是init进程,在自举过程结束时由内核调用。init通常读取与系统有关的初始化文件,并将系统引导到一个状态(如多用户)。init进程绝不会终止。它是一个普通的用户进程,但是它以超级用户特权运行。
函数fork
一个现有进程可以通过fork函数创建一个新进程。
#include <unistd.h> pid_t fork(void); 返回值:子进程返回0,父进程返回子进程ID,若出错,返回-1 |
---|
由fork函数创建的新进程被称为子进程(child process)。fork函数调用一次,返回两次。在子进程中fork返回0,在父进程返回子进程的进程ID。
子进程和父进程继续执行fork调用之后的指令。子进程是父进程的副本。子进程和父进程共享正文段。
现在很多实现并不执行一个父进程数据段、栈和对的完全副本。作为替代,使用了写时复制(Copy-on-Write,COW)技术。这些去区域由父进程和子进程共享,而内核将它们的访问权限改变为只读。如果父进程或者子进程中试图修改这些区域,则内核只为修改区域的那块内存制作一个副本。
一般来说,在fork之后是先执行父进程还是子进程是不确定的,这取决于内核使用的调度算法。
fork之后子进程和父进程的文件共享
使fork失败的两个主要原因是(a)系统中已经有了太多的进程。(b)该实际用户ID的进程总数超过了系统限制。
函数vfork
vfork函数用于创建一个新进程。在子进程调用exec或exit之前,子进程会在父进程的空间中运行。
vfork函数保证子进程先运行,在它调用exec或exit之后父进程才可能被继续调度运行。
这篇关于进程标识和函数fork和函数和vfork(UNIX环境高级编程笔记)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!