- 用消息队列AB进程能够随时收发数据
-
#include<stdio.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> #include<stdlib.h> #include<string.h> #include<pthread.h> pthread_t tid1,tid2; //消息包结构体 struct msgbuf { long mtype; //消息类型,必须大于0 char mtext[128]; //消息内容,该成员类型可变 }; int msqid1; //发送消息包 int msqid2; //接收消息包 void* send(void* arg) { struct msgbuf snd; while(1) { printf("输入消息类型:"); scanf("%ld",&snd.mtype); //消息类型 getchar(); printf("请输入:"); fgets(snd.mtext,sizeof(snd.mtext),stdin); snd.mtext[strlen(snd.mtext)-1] = 0; if(msgsnd(msqid1,&snd,sizeof(snd.mtext),0) < 0) //以阻塞方式发送,消息队列满了,阻塞 { perror("msgsnd"); return NULL; } if(strcmp(snd.mtext,"quit") == 0) exit(0); printf("发送成功\n"); } pthread_exit(NULL); } void* recive(void* arg) { struct msgbuf rsv; ssize_t res = 0; while(1) { bzero(rsv.mtext,sizeof(rsv.mtext)); res = msgrcv(msqid2,&rsv,sizeof(rsv.mtext),0,0); if(res < 0) { perror("msgrsv"); return NULL; } printf("%ld %s\n",rsv.mtype,rsv.mtext); if(strcmp(rsv.mtext,"quit") == 0) exit(0); } pthread_exit(NULL); } int main(int argc, const char *argv[]) { key_t key1 = ftok("./",1); //计算key1值 if(key1 < 0) { perror("ftok"); return -1; } printf("key = %#x\n",key1); key_t key2 = ftok("./",2); //计算key2值 if(key2 < 0) { perror("ftok"); return -1; } printf("key = %#x\n",key2); msqid1 = msgget(key1,IPC_CREAT|0664); //创建一个消息队列 if(msqid1 < 0) { perror("msgget"); return -1; } printf("msqid1 = %d\n",msqid1); msqid2 = msgget(key2,IPC_CREAT|0664); //创建一个消息队列 if(msqid2 < 0) { perror("msgget"); return -1; } printf("msqid1 = %d\n",msqid2); pthread_create(&tid1,NULL,send,NULL); pthread_create(&tid2,NULL,recive,NULL); while(1); pthread_join(tid1,NULL); pthread_join(tid2,NULL); return 0; }
#include<stdio.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> #include<stdlib.h> #include<string.h> #include<pthread.h> pthread_t tid1,tid2; //消息包结构体 struct msgbuf { long mtype; //消息类型,必须大于0 char mtext[128]; //消息内容,该成员类型可变 }; int msqid1; //发送消息包 int msqid2; //接收消息包 void* send(void* arg) { struct msgbuf snd; while(1) { printf("输入消息类型:"); scanf("%ld",&snd.mtype); //消息类型 getchar(); printf("请输入:"); fgets(snd.mtext,sizeof(snd.mtext),stdin); snd.mtext[strlen(snd.mtext)-1] = 0; if(msgsnd(msqid2,&snd,sizeof(snd.mtext),0) < 0) //以阻塞方式发送,消息队列满了,阻塞 { perror("msgsnd"); return NULL; } if(strcmp(snd.mtext,"quit") == 0) exit(0); printf("发送成功\n"); } pthread_exit(NULL); } void* recive(void* arg) { ssize_t res = 0; struct msgbuf rsv; while(1) { bzero(rsv.mtext,sizeof(rsv.mtext)); res = msgrcv(msqid1,&rsv,sizeof(rsv.mtext),0,0); if(res < 0) { perror("msgrsv"); return NULL; } printf("%ld %s\n",rsv.mtype,rsv.mtext); if(strcmp(rsv.mtext,"quit") == 0) exit(0); } pthread_exit(NULL); } int main(int argc, const char *argv[]) { key_t key1 = ftok("./",1); //计算key1值 if(key1 < 0) { perror("ftok"); return -1; } printf("key = %#x\n",key1); key_t key2 = ftok("./",2); //计算key2值 if(key2 < 0) { perror("ftok"); return -1; } printf("key = %#x\n",key2); msqid1 = msgget(key1,IPC_CREAT|0664); //创建一个消息队列 if(msqid1 < 0) { perror("msgget"); return -1; } printf("msqid1 = %d\n",msqid1); msqid2 = msgget(key2,IPC_CREAT|0664); //创建一个消息队列 if(msqid2 < 0) { perror("msgget"); return -1; } printf("msqid1 = %d\n",msqid2); pthread_create(&tid1,NULL,send,NULL); pthread_create(&tid2,NULL,recive,NULL); while(1); pthread_join(tid1,NULL); pthread_join(tid2,NULL); return 0; }
A进程写入一个整型,在该整型后,写入一个字符串
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<string.h>
int main(int argc, const char *argv[])
{
key_t key = ftok("./",10); //计算键值
if(key < 0)
{
perror("ftok");
return -1;
}
printf("key = %#x\n",key);
//创建共享内存
int shmid = shmget(key,32,IPC_CREAT|0664);
if(shmid < 0)
{
perror("shmget");
return -1;
}
printf("shmid = %d\n",shmid);
void* shmaddr = shmat(shmid,NULL,0);
int *pa = (int*)shmaddr;
printf("写入一个整型数据:");
scanf("%d",pa);
getchar();
char *p;
p = (char*)(pa+1);
printf("写入一个字符串:");
scanf("%s",p);
getchar();
return 0;
}
-
-
B进程将共享内存中的整型以及字符串读取出来;
#include<stdio.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> #include<string.h> int main(int argc, const char *argv[]) { key_t key = ftok("./",10); //计算键值 if(key < 0) { perror("ftok"); return -1; } printf("key = %#x\n",key); //创建共享内存 int shmid = shmget(key,32,IPC_CREAT|0664); if(shmid < 0) { perror("shmget"); return -1; } printf("shmid = %d\n",shmid); void* shmaddr = shmat(shmid,NULL,SHM_RDONLY); int *p =(int *)shmaddr; printf("%d",*p); char *pa; pa = (char*)(p+1); printf("%s\n",pa); return 0; }