进程标识和函数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之后父进程才可能被继续调度运行。

猜你喜欢

转载自blog.csdn.net/The_perfect_world/article/details/89356083