1:将昨天的作业(使用管道让2个终端之间互相聊天),使用消息队列去实现
2:将昨天的作业(使用管道让2个终端之间互相聊天) 使用共享内存 + 信号灯集去实现
1、
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int stop=0,msgid;
typedef struct msgbuf
{
long type;
char text[256];
}msg_t;
void sighandler(int signum)
{
if(signum==SIGTSTP)
{
stop=stop==1?0:1;
}
}
void* task()
{
msg_t buf;
int len=0;
while(1)
{
memset(&buf,0,sizeof(buf));
len=msgrcv(msgid,&buf,256,2,0);
printf("接收内容:%s\n",buf.text);
}
}
int main(int argc, const char *argv[])
{
signal(SIGTSTP,sighandler);
key_t key=ftok("./ipc",1);
if(key==-1)
{
perror("ftok");
return 1;
}
msgid=msgget(key,IPC_CREAT|0664);
pthread_t id;
pthread_create(&id,NULL,task,NULL);
pthread_detach(id);
msg_t buf;
int len=0;
while(1)
{
while(stop);
memset(&buf,0,sizeof(buf));
buf.type=1;
printf("发送消息:\n");
scanf("%256s",buf.text);
while(getchar()!=10);
len=strlen(buf.text);
msgsnd(msgid,&buf,len,0);
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int stop=0,msgid;
typedef struct msgbuf
{
long type;
char text[256];
}msg_t;
void sighandler(int signum)
{
if(signum==SIGTSTP)
{
stop=stop==1?0:1;
}
}
void* task()
{
msg_t buf;
int len=0;
while(1)
{
memset(&buf,0,sizeof(buf));
len=msgrcv(msgid,&buf,256,1,0);
printf("接收内容:%s\n",buf.text);
}
}
int main(int argc, const char *argv[])
{
signal(SIGTSTP,sighandler);
key_t key=ftok("./ipc",1);
if(key==-1)
{
perror("ftok");
return 1;
}
msgid=msgget(key,IPC_CREAT|0664);
pthread_t id;
pthread_create(&id,NULL,task,NULL);
pthread_detach(id);
msg_t buf;
int len=0;
while(1)
{
while(stop);
memset(&buf,0,sizeof(buf));
buf.type=2;
printf("发送消息:\n");
scanf("%256s",buf.text);
while(getchar()!=10);
len=strlen(buf.text);
msgsnd(msgid,&buf,len,0);
}
return 0;
}