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 + -
显示快捷键?