Unix系统进程控制方法

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()返回值>0EP进程

 {

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();

 

 

 

 

 

 

 

 

 

 


 

 


总结:

  树型结构图有两个发展方向:向右和向下。向下有时间关系,向右有语句的顺序关系。

 






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值