1、消息队列
#include <allhead.h>
//创建消息队列的结构体
typedef struct{
long type;
char text[256];
}msg_t;
key_t key;
msg_t buf;
int id;
int len = 0;
void* task2(void* arg)
{
while(1)
{
memset(&buf,0,sizeof(buf));
buf.type = 2;
printf("USR1:");
fgets(buf.text,sizeof(buf.text),stdin);
buf.text[strlen(buf.text)-1]='\0';
msgsnd(id,&buf,256,0);
}
}
void* task1(void* arg)
{
while(1)
{
memset(&buf,0,sizeof(buf));
len = msgrcv(id,&buf,256,1,0);
printf("\033[7DUSR2:%s\n",buf.text);
printf("USR1:");
fflush(stdout);
}
}
int main(int argc, const char *argv[])
{
//① 根据文件名创建秘钥
key = ftok("./",1);
if(key == -1)
{
perror("ftok");
return 1;
}
//② 根据同样的秘钥,访问相同的消息队列,不存在则创建
id = msgget(key,IPC_CREAT | 0666);
//③ 向消息队列发送消息
pthread_t id1;
pthread_t id2;
pthread_create(&id1,NULL,task1,NULL);
pthread_create(&id2,NULL,task2,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
#include <allhead.h>
//创建消息队列的结构体
typedef struct{
long type;
char text[256];
}msg_t;
key_t key;
msg_t buf;
int id;
int len = 0;
void* task2(void* arg)
{
while(1)
{
memset(&buf,0,sizeof(buf));
buf.type = 1;
printf("USR2:");
fgets(buf.text,sizeof(buf.text),stdin);
buf.text[strlen(buf.text)-1]='\0';
msgsnd(id,&buf,256,0);
}
}
void* task1(void* arg)
{
while(1)
{
memset(&buf,0,sizeof(buf));
len = msgrcv(id,&buf,256,2,0);
printf("\033[7DUSR1:%s\n",buf.text);
printf("USR2:");
fflush(stdout);
}
}
int main(int argc, const char *argv[])
{
//① 根据文件名创建秘钥
key = ftok("./",1);
if(key == -1)
{
perror("ftok");
return 1;
}
//② 根据同样的秘钥,访问相同的消息队列,不存在则创建
id = msgget(key,IPC_CREAT | 0666);
//③ 向消息队列发送消息
pthread_t id1;
pthread_t id2;
pthread_create(&id1,NULL,task1,NULL);
pthread_create(&id2,NULL,task2,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
2、共享内存和信号灯集
#include <allhead.h>
typedef struct shmbuf
{
char text[256];
}shm_t;
void semwait(int id,int index)
{
struct sembuf buf = {0};
buf.sem_num = index;
buf.sem_op = -1;
buf.sem_flg = SEM_UNDO;
semop(id,&buf,1);
}
void sempost(int id,int index)
{
struct sembuf buf = {0};
buf.sem_num = index;
buf.sem_op = 1;
buf.sem_flg = SEM_UNDO;
semop(id,&buf,1);
}
int main(int argc, const char *argv[])
{
key_t key = ftok("./",1);
if(key==-1)
{
perror("ftok");
return 1;
}
int id = shmget(key,256,IPC_CREAT | 0666 );
if(id==-1)
{
perror("shmget");
return 1;
}
shm_t* addr = shmat(id,NULL,0);
int id1 = semget(key,4,IPC_CREAT | 0666 );
if(id1 == -1)
{
perror("semget");
return 1;
}
semctl(id1,0,SETVAL,0);
semctl(id1,1,SETVAL,1);
semctl(id1,2,SETVAL,0);
semctl(id1,3,SETVAL,1);
int len = 0;
int res = fork();
if(res>0)
{
while(1)
{
if(addr->text!=NULL)
{
semwait(id1,0);
printf("读取到的内容为:%s\n",addr->text);
memset(addr,0,256);
sempost(id1,1);
}
else{break;}
}
}
else if(res==0)
{
while(1)
{
semwait(id1,3);
printf("请输入数据:");
fgets(addr->text,256,stdin);
addr->text[strlen(addr->text)-1]='\0';
sempost(id1,2);
}
}
return 0;
}
#include <allhead.h>
typedef struct shmbuf
{
char text[256];
}shm_t;
void semwait(int id,int index)
{
struct sembuf buf = {0};
buf.sem_num = index;
buf.sem_op = -1;
buf.sem_flg = SEM_UNDO;
semop(id,&buf,1);
}
void sempost(int id,int index)
{
struct sembuf buf = {0};
buf.sem_num = index;
buf.sem_op = 1;
buf.sem_flg = SEM_UNDO;
semop(id,&buf,1);
}
int main(int argc, const char *argv[])
{
key_t key = ftok("./",1);
if(key==-1)
{
perror("ftok");
return 1;
}
int id = shmget(key,256,IPC_CREAT | 0666 );
if(id==-1)
{
perror("shmget");
return 1;
}
shm_t* addr = shmat(id,NULL,0);
int id1 = semget(key,4,IPC_CREAT | 0666 );
if(id1 == -1)
{
perror("semget");
return 1;
}
/*
semctl(id1,0,SETVAL,0);
semctl(id1,1,SETVAL,1);
semctl(id1,2,SETVAL,0);
semctl(id1,3,SETVAL,1);
*/
int len = 0;
int res = fork();
if(res==0)
{
while(1)
{
if(addr->text!=NULL)
{
semwait(id1,2);
printf("读取到的内容为:%s\n",addr->text);
memset(addr,0,256);
sempost(id1,3);
}
else{break;}
}
}
else if(res>0)
{
while(1)
{
semwait(id1,1);
printf("请输入数据:");
fgets(addr->text,256,stdin);
addr->text[strlen(addr->text)-1]='\0';
sempost(id1,0);
}
}
return 0;
}