操作系统-进程控制

来源:互联网 发布:盗梦侦探知乎 编辑:程序博客网 时间:2024/04/29 01:22

附录1.进程的创建#include<stdio.h>#include<stdlib.h>main(){        int p1,p2;if(p1=fork())               /*父进程创建成功*/    putchar('b');else{ if(p2=fork())              /*父进程创建成功*/  putchar('c');    else putchar('a');           /*子进程执行*/}}2.进程的互斥1>同步#include<stdio.h>#include<stdlib.h>main(){int p1,p2,i;if(p1=fork()){ for(i=0;i<500;i++)printf("parent%d\n",i);        wait(0); /* 保证在子进程终止前,父进程不会终止*/exit(0); /*  结束该进程*/}else{  if(p2=fork()){    for(i=0;i<500;i++)         printf("son %d\n",i);                wait(0); /* 保证在子进程终止前,父进程不会终止*/exit(0); /* 向父进程信号0且该进程退出*/} else{    for(i=0;i<500;i++)  printf(“grandchild %d\n",i); exit(0);}}}2>互斥 #include<stdio.h>#include<stdlib.h>main(){int p1,p2,i;if(p1=fork()){     lockf(1,1,0);/*对父进程进行加锁,实现互斥*/     for(i=0;i<500;i++)  printf("parent %d\n",i);     lockf(1,0,0);/*对父进程进行解锁*/      wait(0); /* 保证在子进程终止前,父进程不会终止*/      exit(0); /*  结束该进程*/}else {  if(p2=fork()){ lockf(1,1,0);/*对父进程进行加锁,实现互斥*/     for(i=0;i<500;i++)             printf("son %d\n",i);    lockf(1,0,0);/*对父进程进行解锁*/         wait(0); /* 保证在子进程终止前,父进程不会终止*/exit(0);  }else{  lockf(1,1,0);/*对子进程进行加锁,实现互斥*/      for(i=0;i<500;i++)          printf("grandchild %d\n",i);       lockf(1,0,0);/*对子进程进行解锁*/    exit(0);} }}3.进程的软中断通信#include<stdio.h>#include<signal.h>#include<unistd.h> void waiting(),stop(),alarming();int wait_mark;main(){int p1,p2;if(p1=fork())             /*创建子进程p1*/{if(p2=fork())    /*创建子进程p2*/{wait_mark=1;signal(SIGINT,stop);    /*父进程接收到^c信号,转stop*/signal(SIGALRM,alarming);/*接受SIGALRM,并调用alarming方法            waiting();            while (wait_mark!=0);kill(p1,16);            /*向p1发软中断信号16*/   kill(p2,17);           /*向p2发软中断信号17*/        wait(0);             /*等待子进程p2,实现同步*/wait(0);             /*等待子进程p1,实现同步*/printf("parent process is killed!\n");exit(0);    }else    {wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN);  /*子进程忽略 ^c信号*/while (wait_mark!=0);   lockf(1,1,0);           /*为子进程加锁,实现互斥*/printf("child process2  is killed by parent!\n");lockf(1,0,0);           /*为子进程解锁*/exit(0);}}else{wait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN);  /*忽略^c信号*/while (wait_mark!=0)lockf(1,1,0);            /*为子进程加锁,实现互斥*/printf("child process1 is killed by parent!\n");lockf(1,0,0);            /*为子进程解锁*/exit(0);}}void waiting(){sleep(5);if (wait_mark!=0) kill(getpid(),SIGALRM);     /*获得想要中断的进程号,并返回SIGALRM*/}void alarming(){wait_mark=0;}void stop(){wait_mark=0;}4.进程的管道通信#include <unistd.h>#include <signal.h>#include <stdio.h>int pid1,pid2; main( ){ int fd[2];                       /*为管道定义输入端和输出端*/char outpipe[100],inpipe[100];pipe(fd);                       /*创建一个无名管道*/while ((pid1=fork( ))==-1);         /*进程创建失败*/if(pid1==0)  {lockf(fd[1],1,0);             /*fd[1]写入端加锁*/sprintf(outpipe,"child 1 process is sending message!"); /*将数据放入定义好的缓冲区数组                                             outpipe内*/                    write(fd[1],outpipe,50);     /*向管道写长为50字节的串*/sleep(5);                 /*自我阻塞5秒,让所显示的内容休眠5秒钟,即等待5秒                         钟再显示。子进程pid1和子进程pid2也能对管道进行操作,                        因为他们同属于共同的管道共同共享资源*/ lockf(fd[1],0,0);          /*写入端解锁*/    exit(0);   }else  {while((pid2=fork( ))==-1);    if(pid2==0){ lockf(fd[1],1,0);           /*fd[1]写入端加锁*/        sprintf(outpipe,"child 2 process is sending message!");        write(fd[1],outpipe,50);        sleep(5);        lockf(fd[1],0,0);        exit(0);     }     else     {  wait(0);              /*实现进程间的同步*/         read(fd[0],inpipe,50);   /*从fd[0]端口读出50字节的数据送到inpipe指向的缓冲 */         printf("%s\n",inpipe);         wait(0);         read(fd[0],inpipe,50);         printf("%s\n",inpipe);        exit(0);    }  }}5.进程间消息的创建、发送和接收#include <stdio.h> #include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75          /*定义关键词MEGKEY*/struct msgform              /*消息结构*/{long mtype;char mtexe[100];         /*文本长度*/}msg;int msgqid,i;void CLIENT( ){int i;msgqid=msgget(MSGKEY,0777|IPC_CREAT);   /*通过关键字获得队列*/for(i=10;i>=1;i--){ msg.mtype=i; printf("(client)sent\n");  msgsnd(msgqid,&msg,1030,0);       /*发送消息msg入msgid消息队列,1030                                          为消息的长度*/}exit(0);}void SERVER( ){   msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*创建消息队列*/  do  {  msgrcv(msgqid,&msg,1030,0,0);  /*从队列msgid接受长度为1030的消息msg*/  printf("(server)receive\n");  }while(msg.mtype!=1);             /*消息类型为1时,释放队列*/   msgctl(msgqid, IPC_RMID,0);       /*删除msgqid的消息队列*/}main(){  if(fork()) {SERVER();                   /*创建父进程*/  wait(0);}else CLIENT( );                 /*创建的子进程*/}6.进程共享存储区的创建、附接和断接#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#define SHMKEY  75                   /*定义共享区关键词*/int shmid,i;int *addr; CLIENT(){int i;shmid=shmget(SHMKEY,1024, 0777|IPC_CREAT);    /*获取共享区,长度1024,关键词                                                 SHMKEY*/addr=shmat(shmid,0,0);                /*获取共享区起始地址addr*/for(i=9;i>=0;i--) {while(*addr!= -1);                  printf("(client)sent\n");                 /*打印(client)sent*/*addr=i;                             /*把i赋给addr*/}exit(0);}SERVER(){ do{while(*addr = =-1);printf("(server)received\n%d",*addr);               /*服务进程使用共享区*/if(*addr!=0)*addr=-1;} while(*addr);    wait(0);shmctl(shmid,IPC_RMID,0);                        /*撤销共享存储区,归还资源*/} main(){shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);      /*创建共享区*/addr=shmat(shmid,0,0);                         /*共享区起始地址为addr*/*addr=-1;if(fork()){ SERVER();}else{ CLIENT();} }7.处理器调度 #include<stdio.h>#include<stdlib.h>#include<time.h>struct PCB *head,*tail;//这里是全局的int global_time = 0;            //全局时间  struct PCB{char name[10];         //进程名字struct PCB *next;       //下一个PCB指针int run_time;          //运行时间int priority;           //优先级char status;          //目前状态};struct PCB* initPCB(struct PCB *p, int i){p->name[0] = 'P';p->name[1] = i + '0';p->name[2] = 0;p->next = NULL;printf("Process %s\n", p->name);printf("input run_time: ");scanf("%d", &p->run_time);printf("input priority: ");scanf("%d", &p->priority);/*p->run_time = i+1;p->priority = i;p->status = 'R';*/return p;}//输入任务名称, 时间和优先级,运行状态为E void run(struct PCB *p){printf("Process: %s, running @ tim %d, priority %d, run_time  %d\n",p->name, global_time, p->priority, p->run_time);global_time++;p->run_time--;if(p->priority > 0)p->priority--;}//输出这个任务的状态,全局时间加1,任务还需要的时间减1,优先 级减1 void SortChain(struct PCB *phead,struct PCB *ptail){struct PCB *pMax,*pMaxPre,*pPre,*pTemp;head= tail = NULL;//再初始化 一次,重新把排列好的结点加入到链 表中pPre = pMax= pMaxPre = NULL;//pMax:priority 最大的那个结点,  pMaxPre:pMax前个结点或许用双向链 表更好一些if(phead == NULL){head = tail = NULL;return ;}else{while(phead != NULL){pMax= phead;pMaxPre = phead;for(pTemp = phead;pTemp != NULL; pTemp =  pTemp->next){if(pTemp->priority > pMax->priority  ){pMax = pTemp;pMaxPre = pPre;}pPre= pTemp;}if(pMax == phead){phead = phead->next;}else{pMaxPre->next = pMax->next ;}pMax ->next = NULL;if(head == NULL){tail = head = pMax;}else{tail -> next = pMax;tail= pMax;}}}}int main(void ){int i;struct PCB *p = NULL, *q = NULL;//定义指针p和q,p为待运行队列PCB指针,q为待插入队列PCB指针 head = tail = NULL;for(i = 0;i < 5;i ++){p = (struct PCB *)malloc(sizeof(struct PCB)); //分配空间,让p指向这个PCBinitPCB(p,i);p -> next = NULL;if(head == NULL){// 首先把进 程 链表排列起来! 不一定按照 priority  顺序tail = head = p;}else{tail -> next = p;tail= p;}}SortChain(head,tail);/// 按照 priority顺序排列结点while(head != NULL){//当头节点不为空即链表中还有PCB的时候 printf("Current state:\n");for(p = head; p != NULL; p = p->next){printf("Process %s, priority: %d, run_time  %d\n",p->name, p->priority, p->run_time);}                 //让p指针从 head->next 开始走到末尾,输出每一个状态 p = head;run(p);//p指向第一个PCB,然后进行调度 if(p->run_time <= 0){printf("Process %s ends.\n", p->name);p->status = 'E';///free(p);///这里就不释放了head = p-> next;}               //如果PCB已经结束,输出信息,释放空间 ,进行下一轮 循环 SortChain(head,tail);//按照  priority  顺序 排列结点}                               //如果还需要运行,将PCB插入合适位置 system("pause");return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 自考本科准考证丢了怎么办 自考档案搞丢了怎么办 自考本科档案在自己手里怎么办? 本科自考准考证丢了怎么办 大学团员证丢了怎么办 大学开学团员证丢了怎么办 研究生开学没有团员证怎么办 研究生开学已经不是团员了怎么办 毕业了要搬宿舍怎么办 中专学历认证已停止怎么办 中专不做学历认证考试怎么办 大学生欠学费被扣毕业证怎么办 考警校体检没过怎么办 美国签证申请预约名字写错怎么办 当兵不从学校走怎么办 门牙崩了一小块怎么办 遇到很难过的事情怎么办 小孩子上课精力不集中怎么办 每天工作都很累压力大怎么办 重体力活搬不动怎么办 大学没参加体测怎么办 英文写的很丑怎么办 患有勃起障碍应该怎么办较好 运动过度小腿肌肉酸痛怎么办 高考有纹身是字怎么办 新生儿测听力没过关怎么办 色弱高考体检时没查出来怎么办 公司福利体检查二对半怎么办 高考体检表复印件丢了怎么办 高考体检表身高填错了怎么办 大学档案高考体检表丢了怎么办 工厂组织体检我有乙肝怎么办 我有乙肝单位组织体检怎么办? 矮腰袜子老掉怎么办 短腰袜子老下滑怎么办 中考体检结果丢了怎么办 咳嗽左胸围一处刺痛怎么办? 阴茎小父母催婚怎么办 头发扎进指甲缝怎么办 指甲缝扎流血了怎么办 中考考差了高中怎么办