1.进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元。
进程与程序的不同:a:进程是动态的,程序是静态的;
b:进程是短暂的,程序是长久的;
c:进程与程序的组成不同;
d:通过多次执行,一个程序可以对应多个进程;通过调用关系,一个进程可以包括多个程序。
2.进程的创建:
进程的创建都是由父进程创建的,进程可以创建子进程,子进程也可以创建属于自己的子进程。
外面一般使用的创建系统调用是fork或者vfork或者exce函数族。其中fork用的最多。
fork与vfork的比较:
fork创建的子进程与父进程不会共享空间,子进程会对父进程进行完全的拷贝;但是fork子进程与父进程的执行顺序不确定。
vfork创建的子进程会与父进程共享数据段,并且执行的顺序肯定是子进程在前,父进程在后。
fork被调用一次,会返回两次,并且返回值可能会有三个。0,-1以及子进程的ID。
fork与exce函数族的对比:
fork创建一个新的进程,会产生一个新的PID;
exce启动一个新的程序,替换原有的进程,但是进程的PID不会改变。
exce函数族包括excel以及excev等函数。
3.进程等待:
pid—t wait(int * status)
功能:阻塞该进程,直到某个子进程退出。
pid—t waitpid(pid—t pid,int*status,int options)
功能:会暂停目前进程的执行,直到有信号来到或子进程结束。
4.进程退出:
exit与_exit的区别:
—exit:直接使进程停止,清除其使用的内存,并且清除缓冲区的内容。
exit:在进程停止之前,要检查文件的打开情况,并把文件缓冲区中的内容写回文件才停止进程。
僵尸进程:如果子进程结束了,但是父进程并未为其收尸,那么此时的子进程就是一个僵尸进程。在一般的程序中,僵尸进程存在的时间很短,但是如果父进程是一个死循环一直执行不结束,那么子进程会一直存在,并且占用内存。所以在写程序的时候,父进程一定要调用wait的系统调用来回收子进程。
孤儿进程:父进程死了,子进程就成为孤儿进程。但是孤儿进程并不是没有父进程,当之前的父进程被杀,此时子进程的父进程就是编号为1的进程,也就是所谓的祖先进程。
僵尸进程与孤儿进程的最大区别就是僵尸进程是死的,孤儿进程是活的。