📄 xtd(进程通信).c
字号:
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<time.h>#include<errno.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#include<sys/wait.h>static int w_time[]={7,6,5,4,3,2,1}; //进程的运行时间static int semid=-1; //信号量集的IPC ID //定义要执行的对信号量的等待和通知操作 static struct sembuf sops[]={ {0,1,0},{1,1,0},{0,-1,0},{2,1,0},{3,1,0},{1,-1,0},{4,1,0},{2,-1,0},{5,1,0},{3,-1,0},{6,1,0},{4,-1,0},{7,1,0},{5,-1,0},{6,-1,0},{7,-1,0}}; //进程列表:static struct{ char *name; pid_t PID;}process[]={{"s1",0},{"s2",0},{"s3",0},{"s4",0},{"s5",0},{"s6",0},{"s7",0}};static void WorkTime(int processx,time_t t0){ char *name=process[processx].name; pid_t pid=getpid(); time_t tn; //末时间 int z; if(processx==0) { for(;;) { time(&tn); if(tn-t0>=w_time[processx]) { printf("Process %s is working!\n",name); printf("Process %s has done!\n",name); z=semop(semid,&sops[0],1);if(z==-1){perror("semop()");exit(13);} z=semop(semid,&sops[1],1);if(z==-1){perror("semop()");exit(13);} return; } } } else if(processx==1) { for(;;) { time(&tn); if(tn-t0>=w_time[processx]) { z=semop(semid,&sops[2],1);if(z==-1){perror("semop()");exit(13);} printf("Process %s is working!\n",name);printf("Process %s has done!\n",name); z=semop(semid,&sops[3],1);if(z==-1){perror("semop()");exit(13);} z=semop(semid,&sops[4],1);if(z==-1){perror("semop()");exit(13);} return; } } } else if(processx==2) { for(;;) { time(&tn); if(tn-t0>=w_time[processx]) { z=semop(semid,&sops[5],1);if(z==-1){perror("semop()");exit(13);} printf("Process %s is working!\n",name);printf("Process %s has done!\n",name); z=semop(semid,&sops[6],1);if(z==-1){perror("semop()");exit(13);} return; } } } else if(processx==3) { for(;;) { time(&tn); if(tn-t0>=w_time[processx]) { z=semop(semid,&sops[7],1);if(z==-1){perror("semop()");exit(13);} printf("Process %s is working!\n",name);printf("Process %s has done!\n",name); z=semop(semid,&sops[8],1);if(z==-1){perror("semop()");exit(13);} return; } } } else if(processx==4) { for(;;) { time(&tn); if(tn-t0>=w_time[processx]) { z=semop(semid,&sops[9],1);if(z==-1){perror("semop()");exit(13);} printf("Process %s is working!\n",name);printf("Process %s has done!\n",name); z=semop(semid,&sops[10],1);if(z==-1){perror("semop()");exit(13);} return; } } } else if(processx==5) { for(;;) { time(&tn); if(tn-t0>=w_time[processx]) { z=semop(semid,&sops[11],1);if(z==-1){perror("semop()");exit(13);} printf("Process %s is working!\n",name);printf("Process %s has done!\n",name); z=semop(semid,&sops[12],1);if(z==-1){perror("semop()");exit(13);} return; } } } else if(processx==6) { for(;;) { time(&tn); if(tn-t0>=w_time[processx]) { z=semop(semid,&sops[13],1);if(z==-1){perror("semop()");exit(13);} z=semop(semid,&sops[14],1);if(z==-1){perror("semop()");exit(13);} z=semop(semid,&sops[15],1);if(z==-1){perror("semop()");exit(13);} printf("Process %s is working!\n",name); printf("Process %s has done!\n",name); return; } } } }main(int argc,char **argv){ int z; //返回值 int x; //进程的序号 time_t t0; //计算开始的时间 union semun {int val;struct semid_ds *buf;ushort *array;}semarg; static ushort i[]={ 0,0,0,0,0,0,0,0}; //信号量集的初值 pid_t chPID; //记录进程的PID号 int status; //记录进程结束的状态 //创建无关键字私有信号量集 semid=semget(IPC_PRIVATE,8,0600); if(semid==-1) //创建失败 {perror("semget()");exit(1);} //初始化信号量集 semarg.array=i; z=semctl(semid,0,SETALL,semarg); if(z==-1) {perror("semctl()");exit(1);} //记录初是时间 time(&t0); //创建7个子进程 for(x=0;x<7;x++) { printf("1\n"); if(!(chPID=fork())) //子进程执行的代码 {WorkTime(x,t0);return 0;} else if(chPID==(pid_t)(-1)) {perror("fork()");return;} printf("2\n"); process[x].PID=chPID; } //等待进程全部结束 x=0; for(;x<7;) { chPID=wait(&status); for(x=0;x<7;x++) if(process[x].PID==chPID) {process[x].PID=0;break; } for(x=0;x<7;x++) if(process[x].PID!=0)break; } printf("All process hads ending!"); z=semctl(semid,0,IPC_RMID,semarg); if(z==-1){perror("semctl(IPC_RMID)");exit(1);} return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -