2024年Go最新简洁版即时聊天---I O多路复用使用_if (fd_isset(s, &fdr)),2024年最新2024-2024历年网易跳动Golang面试真题解析

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

}
fdw=open(argv[2],O_WRONLY);		//打开管道二的写端
if(-1==fdw)
{
	perror("open2");
	return -1;
}
printf("Now I can receive:fdr=%d,fdw=%d\n",fdr,fdw);
int ret;	
char buff[35];
struct timeval t;
t.tv_sec=3;
t.tv_usec=0;
fd_set fd_rd;		  //只用检测读即可
while(1)
{
	FD_ZERO(&fd_rd);
	FD_SET(fdr,&fd_rd);
	FD_SET(0,&fd_rd);
	ret=select(fdr+1,&fd_rd,NULL,NULL,&t);
	if(FD_ISSET(fdr,&fd_rd))
	{
		memset(buff,0,sizeof(buff));
		ret=read(fdr,buff,sizeof(buff));
		if(ret>0)
		{
			printf("TWO:");
			puts(buff);
			}else{
					printf("byebye!\n");
					break;
			}
		}
		if(FD_ISSET(0,&fd_rd))
		{
			memset(buff,0,sizeof(buff));
			//puts("请输入:");
			ret=read(0,buff,sizeof(buff));
			if(ret>0)
			{
				write(fdw,buff,strlen(buff)-1);
			}else{
					printf("byebyei\n");
					break;
			}
		}
}
return 0;

}

服务端:

#include"func.h"

int main(int argc,char *argv[])
{
if(3!=argc)
{
printf(“error argcs!\n”);
return -1;
}
int fdr,fdw;
fdw=open(argv[1],O_WRONLY); //打开管道一的写端
if(-1fdw)
{
perror(“open1”);
return -1;
}
fdr=open(argv[2],O_RDONLY); //打开管道二的读端
if(-1
fdr)
{
perror(“open2”);
return -1;
}
printf(“fdw=%d,fdr=%d\n”,fdw,fdr);
char buff[30]={0};
fd_set fd_rd;
int ret;
struct timeval t;
t.tv_usec=0;
while(1)
{
FD_ZERO(&fd_rd);
FD_SET(0,&fd_rd);
FD_SET(fdr,&fd_rd);
t.tv_sec=30;
ret=select(fdr+1,&fd_rd,NULL,NULL,&t);
if(ret>0)
{
if(FD_ISSET(0,&fd_rd))
{
memset(buff,0,sizeof(buff));
//puts(“请输入:”);
ret=read(0,buff,sizeof(buff)); //若果没有接到结束符,就以为一直要输入
if(ret>0)
{
write(fdw,buff,strlen(buff)-1);
}else{
printf(“byebye!\n”);
break;
}
}
if(FD_ISSET(fdr,&fd_rd))
{
memset(buff,0,sizeof(buff));
ret=read(fdr,buff,sizeof(buff));
if(ret>0)
{
printf(“ONE:”);
puts(buff);
}
}
}else{
printf(“no fd read!\n”);
break;
}
}
return 0;
}


  
 **二、融入共享内存和信号锁的 I/O多路复用的简洁版即时聊天**






**1、需求陈述:**


       A,B  两个进程通过管道通信, 像以前的互相聊天一样, 然后  A  进程每次接收到的数据通过  A1  进程显  
 示( 一个新进程, 用于显示A  接收到的信息) ,  A  和  A1  间的数据传递采用共享内存, 对应的有一个  B1  
 进程, 用于显示B  进程接收到的信息。  针对  A,B  进程, 退出时采用  ctrl+c  退出, 当收到对应信号后,  
 自身进程能够通过信号处理函数进行资源清理, 清理后exit  退出进程。 (  A1,B1, 手动关闭即可) 。 界  
 面图如下。     





**2、源代码**





头文件:

#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<string.h>
#include<signal.h>
#include<stdlib.h>

typedef struct Shminfo{
short flag;
char buf[50];
}shminf;



  



  



男孩聊天主程序:

#include"func.h"

//部分定义全局变量
int sem,shmid,fdr,fdw;
shminf *p;

//退出处理函数
void sighandle(int signum)
{
//printf(“I am in out!\n”);
p->flag=3;
sleep(1);
semctl(sem,IPC_RMID,0);
shmdt§;
int handret;
handret=shmctl(shmid,IPC_RMID,0);
//close(fdr);
//close(fdw);
kill(getpid(),SIGINT);
close(fdr);
close(fdw);
exit(0);
}

int main(int argc,char *argv[])
{
signal(SIGINT,sighandle);
if(3!=argc)
{
printf(“error argcs!\n”);
return -1;
}
//信号量设置初始化和共享内存初始化
//int sem;
sem=semget(12356,1,IPC_CREAT|0600);
if(-1sem)
{
perror(“semget”);
return -1;
}
int ret;
ret=semctl(sem,0,SETVAL,1);
if(-1
ret)
{
perror(“semctl”);
return -1;
}
//共享内存
//int shmid;
shmid=shmget(10003,500,IPC_CREAT|0600);
if(-1shmid)
{
perror(“shmid”);
return -1;
}
//共享内存结构体
//shminf *p;
p=(shminf *)shmat(shmid,NULL,0);
if(p
(shminf *)-1)
{
perror(“shmat”);
return -1;
}
p->flag=0;
memset(p->buf,0,sizeof(p->buf));
//初始化P 和 V 的初值
struct sembuf sopp,sopv;
memset(&sopp,0,sizeof(sopp));
memset(&sopv,0,sizeof(sopv));

 sopp.sem_num=0;
 sopp.sem_op=-1;
 sopp.sem_flg=SEM_UNDO;

 sopv.sem_num=0;
 sopv.sem_op=1;
 sopv.sem_flg=SEM_UNDO;

//管道的连接
//int fdr,fdw;
fdw=open(argv[1],O_WRONLY);		//打开管道一的写端
if(-1==fdw)
{
	perror("open1");
	return -1;
}
fdr=open(argv[2],O_RDONLY);		//打开管道二的读端
if(-1==fdr)
{
	perror("open2");
	return -1;
}
printf("fdw=%d,fdr=%d\n",fdw,fdr);
char buff[30]={0};
fd_set fd_rd;
//int ret;
//struct timeval t;
//t.tv_usec=0;
while(1)
{	
	FD_ZERO(&fd_rd);
	FD_SET(0,&fd_rd);
	FD_SET(fdr,&fd_rd);
	//t.tv_sec=30;
	ret=select(fdr+1,&fd_rd,NULL,NULL,NULL);
	//if(ret>0)
	//{
		if(FD_ISSET(0,&fd_rd))
		{
    		memset(buff,0,sizeof(buff));
    		//puts("请输入:");
			ret=read(0,buff,sizeof(buff));		//若果没有接到结束符,就以为一直要输入
			if(ret>0)
			{
                memset(p->buf,0,sizeof(p->buf));
                semop(sem,&sopp,1);
                strcpy(p->buf,buff);
                p->flag=1;
                semop(sem,&sopv,1);
		    	write(fdw,buff,strlen(buff));
			}//else{
                    //p->flag=3;
                    //sleep(1);
                   // kill(getpid(),SIGINT);
				   // signal(SIGQUIT,sighandle);
                    //printf("byebye!\n");
					//break;
                   // signal(SIGINT,sighandle);
			//}
		}
		if(FD_ISSET(fdr,&fd_rd))
		{
    		memset(buff,0,sizeof(buff));
    		ret=read(fdr,buff,sizeof(buff));
			if(ret>0)
			{
                memset(p->buf,0,sizeof(p->buf));
                semop(sem,&sopp,1);
                strcpy(p->buf,buff);
                p->flag=2;         //控制打印次数
                semop(sem,&sopv,1);
                //测试语句两行
    			//printf("Girl:");
                //puts(buff);
			}else{
                 p->flag=3;
                sleep(1);
                semctl(sem,IPC_RMID,0);
                shmdt(p);
                int handret;
                handret=shmctl(shmid,IPC_RMID,0);
                kill(getpid(),SIGINT);
                close(fdr);
                close(fdw);
                exit(0);
               //signal(SIGQUIT,sighandle);
                //printf("byebye!\n");
                //break;
            }
		}
       //signal(SIGQUIT,sighandle);
	/*}else{
			printf("no fd read!\n");
			break;
	}*/
}

return 0;

}


  
 



男孩显示窗口源代码:

#include"func.h"

int main()
{
//连接共享内存和信号量
int sem;
sem=semget(12356,1,IPC_CREAT|0600);
int ret;
int shmid;
shmid=shmget(10003,500,IPC_CREAT|0600);
shminf *pshow;
pshow=(shminf *)shmat(shmid,NULL,0);
while(1)
{
if(2pshow->flag)
{
printf(“Girl:%s”,pshow->buf);
pshow->flag=0;
}
if(1
pshow->flag)
{
printf(“Boy:%s”,pshow->buf);
pshow->flag=0;
}
if(3==pshow->flag)
{
pshow->flag=0;
printf(“byebye!\n”);
kill(getpid(),SIGINT);
// break;
}
}
return 0;
}



  



  



女孩聊天主程序:

#include"func.h"

//部分全局变量
int sem,shmid,fdr,fdw;
shminf *p;

//退出处理函数
void sighandle(int signum)
{

//printf("I am in out!\n");
p->flag=3;
sleep(1);
semctl(sem,IPC_RMID,0);
shmdt(p);
int handret;
handret=shmctl(shmid,IPC_RMID,0);
kill(getpid(),SIGINT);

close(fdr);
close(fdw);
exit(0);

}
int main(int argc,char *argv[])
{
signal(SIGINT,sighandle);
if(3!=argc)
{
printf(“error argcs!\n”);
return -1;
}
//信号量设置初始化和共享内存初始化
//int sem;
sem=semget(12345,1,IPC_CREAT|0600);
if(-1==sem)
{
perror(“semget”);
return -1;
}
int ret;
//初始化锁的值

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

sem=semget(12345,1,IPC_CREAT|0600);
if(-1==sem)
{
perror(“semget”);
return -1;
}
int ret;
//初始化锁的值

[外链图片转存中…(img-iOFGeYBF-1715651109691)]
[外链图片转存中…(img-yOK505pZ-1715651109691)]
[外链图片转存中…(img-kvXqpOax-1715651109692)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值