1.获取进程ID
每个进程都有一个唯一的正数(非零)进程ID(PID)。
getpid函数返回调用进程的PID,getppid函数返回它的父进程PID。
2.创建和终止进程
调用exit函数来终止进程
父进程调用fork 函数创建一个新的运行的子进程。
fork函数只被调用一次,返回两次:一次在调用进程(父进程)中,一次在新创建的子进程中。
实例:
int main{
pid_t pid;
int x=1;
pid=Fork();
if(pid==0){
printf("child:x=%d\n",++x);
exit(0);
}
printf("parent:x=%d\n",--x);
exit(0);
}
在Unix系统上运行这个程序时,得到的结果:
linux>./fork
parent:x=0
child:x=2
学习fork函数,画进程图通常会有所帮助,进程图是刻画程序语句的偏序的一种简单的前趋图。
child:x=2
——>printf————>exit 子进程
|
x==1 | parent:x=0
main——>fork——>printf————>exit 父进程
进程图特别有助于理解带有嵌套fork调用的程序。
3.回收子进程
一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止。
pid_t waitpid(pid_t pid,int *statusp,int options);
1.判定等待集合的成员
- 如果pid>0,那么等待集合就是一个单独的子进程,它的进程ID等于pid.
- 如果pid=-1,那么等待集合就是由父进程所以子进程组成的。
2.修改默认行为
options
- WNOHANG:如果等待集合中的任何子进程都还没有终止,那么就立刻返回(返回值为0)。
- WUNTRACED:挂起调用进程的执行,直到等待集合中一个进程变成已终止或者被终止。
- WCONTINUEN:挂起调用进程的执行,直到等待集合中一个正在运行的进程终止或等待集合中一个被停止的进程收到SIGCONT信号重新开始执行。
3.检查已回收子进程的退出状态
statusp
- WIFEXITED:如果子进程通过调用exit或者一个返回正常终止,就返回真。
4.wait函数
调用wait(&status)等价于调用waitpid(-1,&status,0)。