linux下的消息管道的聊天程序实现项目_第1页
linux下的消息管道的聊天程序实现项目_第2页
linux下的消息管道的聊天程序实现项目_第3页
linux下的消息管道的聊天程序实现项目_第4页
linux下的消息管道的聊天程序实现项目_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在linux下使用管道来进行聊天的小程序1管道管道是一种最基本的IPC机制,由pipe函数创建:#include<unistd.h>intpipe(intfiledes[2]);调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。所以管道在用户程序看起来就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]);向这个文件读写数据其实是在读写内核缓冲区。pipe函数调用成功返回0,调用失败返回-1。开辟了管道之后如何实现两个进程间的通信呢?比如可以按下面的步骤通信。1.父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。2.父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。3.父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信。例管道#include<stdlib.h>#include<unistd.h>浮#defi腔neMA构XLINE吗80锯intm衰ain(v矮oid){狭intn泰;仙intf译d[2];凭pid_t矮pid;暖char喷line[艰MAXLI题NE];宾if(避pipe(讽fd)<用0){刮perr堆or("p梁ipe")佩;蝶exit间(1);}萌If(许(pid陪=for拼k())档<0){毁perr猫or("f桌ork")影;妨exit托(1);}语if(p丽id>纲0){柔/*pa什rent哄*/剪clos恢e(fd[位0]);河write悠(fd[1违],"h怎ello法world万\n",看12);础wait揉(NULL晒);弟}el至se{尿/*ch继ild*晓/写close愤(fd[1丝]);盏n=陷read(语fd[0]块,lin葡e,MA貌XLINE闹);该write宅(STDO枝UT_FI兴LENO,持line踩,n);惠}突retu焰rn0;}挨使用管道有皆一些限制:绵两个进程通弦过一个管道锻只能实现单麻向通信,比歪如上面的例役子,父进程德写子进程读乘,如果有时槐候也需要子茧进程写父进级程读,就必果须另开一个呆管道。请读绒者思考,如崖果只开一个王管道,但是激父进程不关补闭读端,子踩进程也不关籍闭写端,双既方都有读端融和写端,为避什么不能实闯现双向通信片?绑管道的读写何端通过打开纯的文件描述台符来传递,戏因此要通信莲的两个进程坟必须从它们柔的公共祖先率那里继承管臣道文件描述滑符。上面的那例子是父进废程把文件描轧述符传给子神进程之后父菊子进程之间听通信,也可妥以父进程辜fork往两次,把文始件描述符传扫给两个子进涂程,然后两业个子进程之盘间通信,总抚之需要通过心fork南传递文件描假述符使两个卷进程都能访垮问同一管道泥,它们才能潜通信。眉使用管道需状要注意以下闻4斩种特殊情况海(假设都是顽阻塞作I/O新操作,没有亭设置逗O_NON框BLOCK扶标志):抢1.蚕如果所有指店向管道写端喜的文件描述钱符都关闭了亿(管道写端蚁的引用计数求等于伪0朗),而仍然纳有进程从管热道的读端读搅数据,那么败管道中剩余软的数据都被征读取后,再片次扰read籍会返回羊0村,就像读到绍文件末尾一坡样。克2.形如果有指向夕管道写端的毯文件描述符隔没关闭(管运道写端的引锣用计数大于谷0福),而持有纤管道写端的府进程也没有赢向管道中写扩数据,这时波有进程从管莫道读端读数怠据,那么管陵道中剩余的勿数据都被读居取后,再次糖read驶会阻塞,直国到管道中有寇数据可读了农才读取数据景并返回。岗3.猛如果所有指叉向管道读端饥的文件描述青符都关闭了鼻(管道读端放的引用计数特等于摊0吨),这时有鞭进程向管道帮的写端坝write绳,那么该进传程会收到信胞号榜SIGPI丧PE多,通常会导范致进程异常句终止。浅4.院如果有指向碧管道读端的涛文件描述符届没关闭(管勿道读端的引弹用计数大于崭0男),而持有烘管道读端的杯进程也没有场从管道中读冠数据,这时产有进程向管赢道写端写数例据,那么在昌管道被写满饺时再次侵write常会阻塞,直销到管道中有号空位置了才足写入数据并仁返回。响管道的这四悔种特殊情况公具有普遍意嘱义洒2.管道的间聊天小程序1.李四端磨#incl虾ude<s翻tdio.蛇h>派#incl斥ude<s另tdlib认.h>浅#incl部ude<s上tring扯.h>常#incl稀ude<f挥cntl.谢h>峰#incl捧ude<s寇ys/se岛lect.馆h>西#incl哭ude<s劲ys/ty燕pes.h奇>流#incl嫂ude<s验ys/st梢at.h>裕#incl石ude<e互rrno.谦h>兴/*李四端冷*/因/*巧叶建敏*/冰/*QQ:舌23081绝7742*床/仅intm窃ain(){利int较i,rfd宁,wfd,打len=0围,fd_i葵n;馆char念str[拢128];天int凯flag,僚stdin唉flag;探宝fd_se狗twri箩te_fd货,read创_fd;杀stru亏ctti苗meval造net_仰timer绕;前mkfi鼻fo("f喉ifo1"姓,S_IW姜USR|S字_IRUS壤R|S_I档RGRP|座S_IRO躬TH);模mkfi竖fo("f张ifo2"树,S_IW枪USR|S套_IRUS史R|S_I翅RGRP|打S_IRO明TH);伞rfd=贤open(搂"fifo数1",O_似RDONL榜Y);慕wfd=伞open(锤"fifo戴2",O_矩WRONL粗Y);宫if(r服fd<=0鹿||w倡fd<=0融)ret漂urn0末;刃prin羞tf("这乐是李统四侮端!\n"且);赌whil蒙e(1){晨FD_壳ZERO(令&read英_fd);查FD_岗SET(r叨fd,&r想ead_f纱d);储FD_滴SET(f惠ileno叉(stdi旁n),&r程ead_f兽d);浩net亏_time拴r.tv_畅sec=5从;骑net可_time恩r.tv_嘴usec=出0;谎mem吧set(s世tr,0,尚sizeo宜f(str狐));弯if(掠i=sel磨ect(r凤fd+1,楚&read庆_fd,N骑ULL,N府ULL,&泊net_t牧imer)秋<=0)液c稳ontin嗓ue;沟if(风FD_IS渔SET(r络fd,&r证ead_f施d)){俯re考ad(rf坟d,str岁,size墓of(st换r));帆pr户intf(矩"----肥-----滥-----剥-----是-----垦-----留\n");狗pr段intf(雾"心张三突:%s\n欣",str消);}匆if(歼FD_IS幸SET(f继ileno用(stdi虑n),&r潮ead_f元d)){此pr岛intf(汤"----抓-----席-----齐-----艘-----叉-----缺-\n")搞;肥fg芒ets(s惑tr,si纯zeof(晋str),奉stdin神);闭le掘n=wri叉te(wf榨d,str龄,strl柴en(st雾r));}}渡clos关e(rfd赏);厅clos徐e(wfd问);}2.张三端凭#incl纳ude<努stdio熊.h>前#incl刮ude<完stdli筝b.h>讲#incl贯ude<饼fcntl蜂.h>闭#incl抵ude<榨strin谷g.h>跃#incl竖ude<闭sys/s笛elect稀.h>愤#incl决ude<秆sys/s猛tat.h剩>颤#incl肌ude<惰errno嗽.h>耗/*冈张三喂端*/防/*男叶建敏*/科/*QQ:寿23081下7742*连/婚intm竿ain(){寇inti领,rfd,帮wfd,l叮en=0,骤fd_in楚;造char蓄str[2援56];先intf于lag,s动tdinf侄lag;访fd_se赛twri热te_fd有,read抽_fd;辞struc昆ttim浇eval和net_t辨imer;据mkfif抖o("fi峰fo1",亦S_IWU由SR|S_悠IRUSR丰|S_IR爱GRP|S刻_IROT移H);络mkfif磨o("fi岁fo2",兄S_IWU枯SR|S_竭IRUSR烧|S_IR街GRP|S疏_IROT圈H);打wfd=o貌pen("泥fifo1日",O_W掩RONLY健);芹rfd=o场pen("将fifo2亡",O_R末DONLY诸);馆if(wf冬d<=0|水|rfd<牧=0)re训turn逃0;满print揭f("这是终张三惹端!\n"方);挺while环(1){上FD_ZE貌RO(&r环ead_f映d);量FD_SE姥T(rfd投,&rea韵d_fd)率;询FD_SE消T(fil瓜eno(s折tdin)购,&rea瓦d_fd)你;络net_t距imer.破tv_se皮c=5;辛net_t圈imer.画tv_us峡ec=0;朴memse戏t(str句,0,si旺zeof(畅str))满;嫌if(i=健selec饮t(rfd丑+1,&r商ead_f寄d,NUL故L,NUL潮L,&ne偏t_tim棍er)<=搏0)圈conti陪nue;卷if(FD疾_ISSE锯T(rfd剧,&rea枝d_fd)隔){墨read(窑rfd,s军tr,si庆zeof(担str))明;虏print巩f("--觉-----命-----议-----益-----唤--\n"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论