概述
进程和线程的概念是linux中必然涉及的,进程是系统进行资源分配的最小单位,线程时系统进行调度的最小单位。
进程和程序的区别可以简单理解为动和静的区别,但是进程和程序并不是一一对应关系,可能一个进程对多个程序,一个程序对多个进程。
在一个进程中创建新的进程,则原有进程称为父进程,新的进程称为子进程。
进程的区分是通过进程ID—PID来区分的。
有关于进程的操作涉及创建子进程、获取ID等,还和进程有关系的就是一些进程间的通信以确保进程之间可能存在的协同关系。
子进程创建
函数 | 作用 |
---|---|
pid_t getpid(void) | 获得当前进程的pid |
pid_t getppid(void) | 获得当前进程的父进程的pid |
pid_t fork(void) | 在进程中创建子进程,子进程的数据空间和堆栈空间都会从父进程复制,代码段共享。调用一次会返回两次结果,可能返回值:父进程中返回子进程pid,子进程返回0,失败错误返回负值。判断返回值来判断处于父进程还是子进程还是创建失败。父子进程运行先后顺序不定 |
pid_t vfork(void) | 子进程和父进程共享数据段,且子进程先运行,父进程之后在运行 |
以上的创建函数结果中,子进程会有新的PID。
还有一个exec函数族,这个函数族可以用来创建替换的进程,即新进程会沿用创建它的进程PID。
父进程回收子进程
进程运行结束后,其资源如PID需要被回收,这个回收的工作可以是父进程来做,也可以是系统的init进程来做。如果不回收,则会形成僵尸进程,即占着PID等资源不释放。
父进程回收子进程的函数
pid_t wait(int *status)
该函数将阻塞父进程,直到其某个子进程退出。