类QQ聊天实现(基于linux 管道 信号 共享内存)

一:任务描述

A

二:代码展示

A进程

#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/shm.h>#include <sys/sem.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/time.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <signal.h>int shm_id;struct t{char buf[128];};struct t *p;void hanle(int sig){shmdt(p);shmctl(shm_id,IPC_RMID,NULL);//删除共享内存printf("delete OK……..\n");exit(0);}int main(){//A进程signal(SIGINT,hanle);//捕捉 ctrl+c信号shm_id=shmget((key_t)1234,4096,0600|IPC_CREAT);//创建了一个共享内存//struct t *p;p=(struct t*)shmat(shm_id,NULL,0);//拿到内存的指针结构体int f1;f1=open("1.fifo",O_WRONLY);//对1 打开写端int f2;f2=open("2.fifo",O_RDONLY);//对2 打开读端fd_set readset;//定义了可读集合int maxfd;maxfd=STDIN_FILENO > f2 ? STDIN_FILENO+1:f2+1;struct timeval check;check.tv_sec=1;//设置查看时间是一秒char buf[128];while(1){FD_ZERO(&readset);//初始化FD_SET(STDIN_FILENO,&readset);//添加监控对象FD_SET(f2,&readset);select(maxfd,&readset,NULL,NULL,&check);//返回可读的监控对象if(FD_ISSET(STDIN_FILENO,&readset)){//如果监控到了1管道中有标准输入 那么获取到数据 写到管道中memset(buf,0,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';write(f1,buf,sizeof(buf));//写到管道1中}if(FD_ISSET(f2,&readset)){//监控到了管道2中可以读memset(buf,0,sizeof(buf));read(f2,buf,sizeof(buf));//从管道2中读到buf了strcpy(p->buf,buf);//将管道2中读到的buf 弄到共享内存printf("from 2: %s\n",buf);}if(strcmp(buf,"bye")==0){break;}}exit(0);}B进程#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/shm.h>#include <sys/sem.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/time.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>int shm_id;struct t{char buf[128];};struct t *p;void hanle(int sig){shmdt(p);shmctl(shm_id,IPC_RMID,NULL);//删除共享内存printf("delete OK……..\n");exit(0);}int main(){//B进程signal(SIGINT,hanle);shm_id=shmget((key_t)1235,4096,0600|IPC_CREAT);//struct t *p;p=(struct t*)shmat(shm_id,NULL,0);int f1;f1=open("1.fifo",O_RDONLY);//对1 打开读端int f2;f2=open("2.fifo",O_WRONLY);//对2 打开写端fd_set readset;//定义了可读集合int maxfd;maxfd=STDIN_FILENO > f1 ? STDIN_FILENO+1:f1+1;struct timeval check;check.tv_sec=1;//设置查看时间是一秒char buf[128];while(1){FD_ZERO(&readset);//初始化FD_SET(STDIN_FILENO,&readset);//添加监控对象FD_SET(f1,&readset);select(maxfd,&readset,NULL,NULL,&check);//返回可读的监控对象if(FD_ISSET(STDIN_FILENO,&readset)){//如果监控到了1管道中有标准输入 那么获取到数据 写到管道中memset(buf,0,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';write(f2,buf,sizeof(buf));//写到管道2中}if(FD_ISSET(f1,&readset)){//监控到了管道2中可以读memset(buf,0,sizeof(buf));read(f1,buf,sizeof(buf));//从管道1中读strcpy(p->buf,buf);//将读出的字符 放到共享内存中printf("from 1: %s\n",buf);}if(strcmp(buf,"bye")==0){break;}}exit(0);}A1进程

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/shm.h>#include <string.h>int shm_id;struct t{char buf[128];};struct t *p;void hanle(int sig){shmdt(p);shmctl(shm_id,IPC_RMID,NULL);//删除共享内存printf("delete OK……..\n");exit(0);}int main(){shm_id=shmget((key_t)1234,4096,0600|IPC_CREAT);//获得了共享内存//struct t *p;p=(struct t*)shmat(shm_id,NULL,0);//这个也拿到了char s[128]={0};while(1){if(strcmp(s,p->buf)!=0){//字符串不相同 那么就打印出来strcpy(s,p->buf);printf("from B :%s\n",p->buf);}}exit(0);}

B1进程

<span style="font-size:14px;">#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/shm.h>#include <string.h>int shm_id;struct t{char buf[128];};struct t *p;void hanle(int sig){shmdt(p);shmctl(shm_id,IPC_RMID,NULL);//删除共享内存printf("delete OK……..\n");exit(0);}int main(){shm_id=shmget((key_t)1235,4096,0600|IPC_CREAT);//获得了共享内存//struct t *p;p=(struct t*)shmat(shm_id,NULL,0);//这个也拿到了char s[128]={0};while(1){if(strcmp(s,p->buf)!=0){//字符串不相同 那么就打印出来strcpy(s,p->buf);printf("from A :%s\n",p->buf);}}exit(0);}</span><span style="font-size:18px;"></span>

三:结果显示

版权声明:本文为博主原创文章,未经博主允许不得转载。

,开上一部车,装着我们的故事,

类QQ聊天实现(基于linux 管道 信号 共享内存)

相关文章:

你感兴趣的文章:

标签云: