Unix系统进程控制需要耐心,因为有fork()。当一个unix系统的程序中有多个fork()时,就要小心进程的发展方向是否引起混淆。因此,有三个技术要大家掌握:
(1)进程分析图
方法1:树型结构图。方法2:线索分析图
(2)server或者EP进程对进程执行顺序的控制
(3)多道程序设计中进程的时间控制:同步和互斥。
1.进程分析图
树型结构图可分析并发程序和并行程序。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<stdlib.h>
#include<sys/wait.h>
main()
{
int i;
if(fork())//fork()返回值>0,EP进程
{
i=wait(); //EP进程等待子进程运行完成
//子进程运行结束,EP进程才继续执行。
printf(“It is parent process.\n”);
printf(“The child process,ID number %d,isfinished.\n”,i);
}
else{
printf(“It is child process.\n”);
exit(); //子进程结束退出。
}
}
(2)EP进程或者server对子进程执行顺序的控制
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h>
#define MAXBUF 300
void signalhandle(int sig)
{
pid_t pid;
while((pid=waitpid(-1,NULL,0))>0)
printf(“signalhandle reaped %d\n”,(int)pid);
if(errno!=ECHILD)//read在中断后被提前返回了
printf(“waitpid error”);
sleep(2);
return;
}
int main()
{
inti,n;
char buf[MAXBUF];
pid_t pid[i];
if(signal(SIGCHLD,signalhandle)==SIG_ERR//当有一个子进程exit(),UNIX OS发送一个SIGCHILD信号给parent进程
printf(“signal error”);
for(i=0;i<=2;i++){
pid[i]=fork();//EP进程用数组控制子进程的执行顺序
if(pid[i]==0){
printf(“Hello from child%d\n”,(int)getpid());
sleep(1);
exit(0);
}
}
while((n=read(STDIN_FILENO,buf,sizeof(buf)))<0)
//接收键盘输入STDIN_FILENO
if(errno!=EINTR)
//EP进程收到一个信号时,
read()被中断则不再继续,返回一个错误条件,置errno=EINTR
printf(“readerror”);
printf(“parent processing input\n”);
while(1)
;
exit(0);
}
i=2 |
i=3 |
signal(SIGCHLD,…) |
fork() |
printf |
sleep(1) |
exit(0) |
fork() |
fork() |
sleep(1) |
exit(0) |
sleep(1) |
exit(0) |
if(issig()) psig(); |
总结:
树型结构图有两个发展方向:向右和向下。向下有时间关系,向右有语句的顺序关系。