1.消息队列消发送接收数据
发送数据端
#include <myhead.h>
#define leng sizeof(struct msgbuf)-sizeof(long)
struct msgbuf
{
long mtype; /* 消息的类型*/
char mtext[1024]; /* 消息的正文*/
};
int main(int argc, const char *argv[])
{
key_t key=ftok("./",'6');
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID=msgget(key,IPC_CREAT|0664);
if(msgID==-1)
{
perror("msgget");
return -1;
}
struct msgbuf send;
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();
printf("请输入消息的正文:");
fgets(send.mtext,sizeof(send.mtext),stdin);
send.mtext[strlen(send.mtext)-1]='\0';
msgsnd(msgID,&send,leng,0);
if(strcmp(send.mtext,"quit")==0)
{
break;
}
}
if(msgctl(msgID,IPC_RMID,NULL)==-1)
{
printf("删除失败\n");
}
return 0;
}
接收数据端
#include <myhead.h>
#define leng sizeof(struct msgbuf)-sizeof(long)
struct msgbuf
{
long mtype; /* 消息的类型*/
char mtext[1024]; /* 消息的正文*/
};
int main(int argc, const char *argv[])
{
key_t key=ftok("./",'6');
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID=msgget(key,IPC_CREAT|0664);
if(msgID==-1)
{
perror("msgget");
return -1;
}
struct msgbuf rcv;
while(1)
{
msgrcv(msgID,&rcv,leng,0,0);
printf("%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
{
break;
}
}
return 0;
}
2.共享内存发送接收数据
发送数据端
#include <myhead.h>
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'6');
if(key==-1)
{
perror("ftok");
return -1;
}
int shmID=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
if(shmID==-1)
{
perror("shmget");
return -1;
}
char *shmADD=shmat(shmID,NULL,0);
if(shmADD==(void *)-1)
{
perror("shmat");
return -1;
}
char buff[1024];
while(1)
{
printf("请输入共享内存的内容:");
fgets(buff,sizeof(buff),stdin);
strcpy(shmADD,buff);
if(strcmp(shmADD,"quit\n")==0)
{
break;
}
}
return 0;
}
接收数据端
#include <myhead.h>
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'6');
if(key==-1)
{
perror("ftok");
return -1;
}
int shmID=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
if(shmID==-1)
{
perror("shmget");
return -1;
}
char *shmADD=shmat(shmID,NULL,0);
if(shmADD==(void *)-1)
{
perror("shmat");
return -1;
}
char buff[1024];
while(1)
{
printf("%s\n",shmADD);
if(strcmp(shmADD,"quit\n")==0)
{
break;
}
}
return 0;
}
3、建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列
user1
#include <myhead.h>
#define leng sizeof(struct msgbuf) - sizeof(long)
struct msgbuf {
long mtype; /* 消息的类型*/
char mtext[1024]; /* 消息的正文*/
};
pthread_mutex_t fastmutex;
int send_data()
{
pthread_mutex_lock(&fastmutex);
key_t key=ftok("./",'1');
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID=msgget(key,IPC_CREAT|0664);
if(msgID==-1)
{
perror("msgget");
return -1;
}
struct msgbuf send;
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();
printf("请输入消息的正文:");
fgets(send.mtext,sizeof(send.mtext),stdin);
send.mtext[strlen(send.mtext)-1]='\0';
msgsnd(msgID,&send,leng,0);
if(strcmp(send.mtext,"quit")==0)
{
break;
}
}
if(msgctl(msgID,IPC_RMID,NULL)==-1)
{
printf("删除失败\n");
}
pthread_mutex_unlock(&fastmutex);
return 0;
}
int rcv_data()
{
pthread_mutex_lock(&fastmutex);
key_t key=ftok("./",'a');
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID=msgget(key,IPC_CREAT|0664);
if(msgID==-1)
{
perror("msgget");
return -1;
}
struct msgbuf rcv;
while(1)
{
msgrcv(msgID,&rcv,leng,0,0);
printf("%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
{
break;
}
}
pthread_mutex_unlock(&fastmutex);
return 0;
}
int main(int argc, const char *argv[])
{
pthread_mutex_init(&fastmutex, NULL);
pid_t pid;
pid=fork();
if(pid>0)
{
send_data();
}
else if(pid==0)
{
rcv_data();
}
else
{
perror("fork");
return -1;
}
pthread_mutex_destroy(&fastmutex);
return 0;
}
user2
#include <myhead.h>
#define leng sizeof(struct msgbuf) - sizeof(long)
struct msgbuf {
long mtype; /* 消息的类型*/
char mtext[1024]; /* 消息的正文*/
};
pthread_mutex_t fastmutex;
int send_data()
{
pthread_mutex_lock(&fastmutex);
key_t key=ftok("./",'a');
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID=msgget(key,IPC_CREAT|0664);
if(msgID==-1)
{
perror("msgget");
return -1;
}
struct msgbuf send;
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();
printf("请输入消息的正文:");
fgets(send.mtext,sizeof(send.mtext),stdin);
send.mtext[strlen(send.mtext)-1]='\0';
msgsnd(msgID,&send,leng,0);
if(strcmp(send.mtext,"quit")==0)
{
break;
}
}
if(msgctl(msgID,IPC_RMID,NULL)==-1)
{
printf("删除失败\n");
}
pthread_mutex_unlock(&fastmutex);
return 0;
}
int rcv_data()
{
pthread_mutex_lock(&fastmutex);
key_t key=ftok("./",'1');
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID=msgget(key,IPC_CREAT|0664);
if(msgID==-1)
{
perror("msgget");
return -1;
}
struct msgbuf rcv;
while(1)
{
msgrcv(msgID,&rcv,leng,0,0);
printf("%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
{
break;
}
}
pthread_mutex_unlock(&fastmutex);
return 0;
}
int main(int argc, const char *argv[])
{
pthread_mutex_init(&fastmutex, NULL);
pid_t pid;
pid=fork();
if(pid>0)
{
send_data();
}
else if(pid==0)
{
rcv_data();
}
else
{
perror("fork");
return -1;
}
pthread_mutex_destroy(&fastmutex);
return 0;
}