APUE——进程控制

1.进程标志符:

    (1)每个进程都有一个非负整数表示的唯一进程ID,并且进程ID可以重用。ID为0的进程通常是调度进程,被称为交换进程,此进程是内核的一部分,不执行任何磁盘上的程序,也被称为系统进程。进程ID1是init进程,在自举过程中由内核调用,是一个普通的用户进程,但是以超级用户权限运行。

    (2)获取进程标志符的函数:

    

#include

pid_t   getpid(void);

pid_t   getppid(void);
前者返回调用进程的进程ID,后者返回调用进程的父进程ID。

    (3)fork函数:

    

#include

pid_t  fork(void);
一次调用,两次返回。父进程里返回子进程的进程ID,子进程返回0.调用之后,子进程是父进程的副本,子进程获得父进程数据空间、堆、栈的副本,但是并不共享,反而正文段是共享的。现在的很多实现都采取了写时复制技术(COW)。父进程的所有打开文件描述符都被复制到子进程,父子进程共享同一个文件表项。这种共享方式使父子进程对同一文件使用了一个文件偏移量。

    (4)vfork函数和fork函数的不同:(1) vfork和fork函数都创建一个子进程,但它并不将父进程的地址空间完全复制到子进程,相反,在调用exec函数之前它在父进程中运行,与父进程共享变量资源。(2)vfork保证子进程先运行,在其调用exec或exit之后父进程才可能被调度。

    (5)不管进程如何终止,最后都会运行内核中的同一段代码,这段代码为相应进程关闭所有的打开文件描述符,释放它的存储器资源。子进程终止时,父进程可以通过wait函数或waitpid函数获取子进程的终止状态。如果一个进程的父进程在其终止之前终止,则此进程会被init进程领养,其父进程ID会变为1。一个已经终止、但是其父进程尚未对其进行善后(获取终止子进程的有关信息、释放它仍占有的资源)的进程被称为僵尸进程。

    (6)exec函数:创建子进程后,子进程往往要调用一种exec函数以执行另一个程序,但是进程ID没有变。

     

你可能感兴趣的:(unix)