⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xtd(进程通信).c

📁 一个简单的关于LINUX下的进程间通讯的演示,使用的是信号量.适合初学编程的同学一起学习!
💻 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 + -