connect.c~

来自「一个多进程通信的演示」· C~ 代码 · 共 102 行

C~
102
字号
// copy#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <linux/sem.h>
#include <linux/shm.h>#include "connect.h"
int semid;
int shmid;
int *s,*finish,*t,d;#define  LOOPS			10#define	S_ID			300#define 	T_ID			400#define 	FINISH_ID 		500void P(int semid,int index)
{
	struct sembuf sem;
	sem.sem_num = index;
	sem.sem_op = -1;
	sem.sem_flg = 0;
	semop(semid,&sem,1);
	return;
}


void V(int semid,int index)
{
	struct sembuf sem;
	sem.sem_num = index;
	sem.sem_op =  1;
	sem.sem_flg = 0;
	semop(semid,&sem,1);
	return;
}int initConnect(){	union semun  semopts;
	int res,i;

        //创建或打开信号量集合semid,该集合共有两个信号量,编号分别为0和1
	semid = semget(1,4,IPC_CREAT|0666);      
	if (semid<0) {
		printf("error");
	       	return;
	}

        //打开共享内存shmid,大小为一个整型数的空间大小
	shmid = shmget(T_ID,sizeof(int),IPC_CREAT|0666);  
	if (shmid<0) {
		printf("error");
	       	return;
	}
    
        //用指针t指向缓冲区内存
	t = (int *)shmat(shmid,NULL,SHM_R|SHM_W);     
        //打开共享内存shmid,大小为一个整型数的空间大小
	shmid = shmget(FINISH_ID,sizeof(int),IPC_CREAT|0666);  
	if (shmid<0) {
		printf("error");
	       	return;
	}

        //用指针t指向缓冲区内存
	finish = (int *)shmat(shmid,NULL,SHM_R|SHM_W);   
	return 1;}void waitForSignal(){	P(semid,3);
      d=*t;
	printf("proc3 signal come!\n",d);
		V(semid,2);}void transSingal(){	if( *finish == 1 ){	
		semctl(semid,0,IPC_RMID,0);         //删除0号信号量
		semctl(semid,1,IPC_RMID,0);         //删除1号信号量		semctl(semid,2,IPC_RMID,0);         //删除0号信号量
		semctl(semid,3,IPC_RMID,0);         //删除1号信号量	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?