1、进程标识符pid
类型pid_t;;最多容纳三万多,16位有符号整型
ps命令
ps axf
getpid();
getppid();
2、 进程的产生
fork();
注意理解关键字:duplicating,意味着拷贝、克隆、一模一样的完整的两份代码,执行的位置也一样;
fork后的父子进程区别:
- fork的返回值不同;
- pid不同,ppid不同;
- 未决信号和文件锁不继承;
- 资源利用量清零;
init进程:1号,是所有进程的祖先进程
- 调度器的调度策略来决定哪个进程先运行;不可猜测父子进程谁先运行;
- fork前需要刷新缓冲区
自动刷新:加了\n当你在输出标准输出时,因为采用了行缓存,相当于自动刷新了缓冲区;
但是当你输出到/tmp/out时,则会打印两次begin。是因为fork时连带缓冲区的begin也复制给子进程了;
手动刷新:fork前加fflush(NULL);无论加没加/n,是否标准输出,都只会打印一次Begin;
编程小题目:
- 用200个子进程判断两百个数是否质数;
注意子进程干完活得结束子进程(exit、return);
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define LEFT 30000000
#define RIGHT 30000200
int main()
{
int i, j, mark;
for (i = LEFT; i <= RIGHT; i++)
{
mark = 1;
for (j = 2; j < i / 2; j++)
{
if(i%j == 0)
{
mark = 0;
break;
}
}
if(mark)
printf("%d is a primer\n",i);
exit(0); 一定要结束子进程;
}
exit(0);
}
- 谁创建谁回收;
可以把子进程看作是父进程创建的一种资源,如果父进程不结束(也不回收资源),子进程则可能变成僵尸进程;
父进程结束的子进程会变成孤儿进程,由init()管理;
僵尸进程的主要危害是占用pid资源;
vfork();
- fork()的”写时拷贝“技术:
- 谁写入谁拷贝;
- 只读时父子进程共享物理内存;
3. 进程消亡和释放资源
wait();
waitpid ();
分配算法:
- 分块法;
- 交叉分配算法;一般交叉算法要优于分块法;
- 池
4.exec函数
5、用户权限和组权限
6. 观摩课:解释器文件
7、 system()
8、进程会计
9、进程时间
10、