进程与fork
Linux系统的一个重要的特点就是可以同时启动多个进程。由OS的定义有进程是OS资源管理的最小单位;进程是程序的一次执行形成的动态实体,在执行的过程中拥有独立的内存单元,每个进程都通过唯一的进程ID表示
进程被创建时分配一个唯一的表示ID,当一个进程结束时,释放所占有的资源,包括ID标识
进程的创建方式:1、由系统创建(系统进程),它们之间是平等的;2、它的父进程创建(系统调用fork创建进程),子进程和父进程有隶属关系,子进程可以创建进程,子进程可以继承父进程几乎所有资源。
fork函数:调用一次返回两个值,一个是父进程调用fork函数的返回值为子进程的进程ID;另一个是子进程中fork函数的返回值“0”(0表示成功调用)。创建失败返回“-1”
一个简单的fork例子
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<sys/types.h>
- int main(void)
- {
- pid_t pid;
-
- printf("Process Creation Study\n");
- pid = fork();
- switch(pid){
- case 0:
- printf("ChildP running, CurPid is %d, ParentPid is %d\n", pid, getppid());
- break;
- case -1:
- perror("Process creation failed\n");
- break;
- default :
- printf("ParentP running, ChildPid is %d, ParentPid is %d\n", pid, getpid());
- }
- exit(0);
- }
linux进程的状态
- 运行状态:进程正在运行或在运行队列中等待运行
- 可中断等待状态:进程正在等待某个时间完成的过程中可以被信号或定时器唤醒
- 不可中断等待状态:进程正在等待某个时间完成的过程中不可以被信号或定时器唤醒
- 僵死状态:进程已终止,但进程描述符仍在,需父进程调用wait释放
- 停止状态:进程收到SIGSTOP,SIGSTP,SIGTIN,SIGTOU信号后停止运行
fork和vfork的异同
- 都是一次调用返回两个值
- fork创建子进程,子进程仅完全复制父进程的资源,这样的子进程独立于父进程
- vfork创建的子进程父进程的地址空间,子进程对该地址空间的任何修改为父进程所见
- fork创建的子进程,哪一个先运行取决于OS的调度算法
- vfork保证子进程先运行,只有在调用exec或exit,父进程才可能被调度运行
fork创建进程会使系统的开销很大,这些开销并不是所有情况都需要的;vfork不会拷贝父进程的地址空间,大大的减少了系统开销。
进程终止顺序不通产生的效果:
- 父子进程的终止先后顺序不通会产生不通的结果
- 父进程先于子进程退出,则子进程会被init进程接管
- 子进程先于父进程终止,若父进程又没有调用wait函数等待子进程结束,子进程进入僵死状态
僵死状态的进程(僵尸进程):进程处于僵死状态时,内存只保留该进程的一些必要信息(PCB)以备父进程所需,此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数;如果子进程先于父进程终止,且父进程调用了wait,则父进程会等待子进程结束。
阅读(930) | 评论(0) | 转发(0) |