利用命名管道实现进程间的通信(简单聊天程序的实现)

管道的本质是一种文件,通常是指把一个进程的输出直接传递给另一个进程的输入。

命名管道(named pipe)是一种特殊的文件类型(FIFO文件),它在文件系统中以文件名的形式存在。

下面是Linux中命名管道的文件格式:

通过命令行创建命名管道可以通过mkfifo命令,函数调用如下所示:

1 #include <sys/types.h>
2 #include <sys/stat.h>
3
4 int mkfifo(const char *filename,mode_t mode);

了解以上概念后,我们可以通过open(),read(),write(),close()实现简单的聊天程序,

但需要注意的是当没有数据可读时,read调用通常会阻塞,即它将暂停进程来等待直到有数据达到为止。

对于一个已关闭写数据的管道做read调用将返回0而不是阻塞,这与读取一个无效的文件描述符不同,

read把无效的文件描述符看作一个错误并返回-1。

接下来为大家展示一下利用两个命名管道实现简单聊天程序^_^

进程一:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<sys/types.h>
 5 #include<sys/stat.h>
 6 #include<fcntl.h>
 7 #include<unistd.h>
 8
 9 int main(int argc,char* argv[])
10 {//c1->cl2 cl2->cl1
11     int fd_send=open(argv[1],O_WRONLY);
12     int fd_recv=open(argv[2],O_RDONLY);
13     if(-1==fd_send||-1==fd_recv)
14     {
15         perror("open");
16         exit(1);
17     }
18     printf("ok!\n");
19     char buf[1024];
20     while(memset(buf,0,1024),read(0,buf,1024)!=0)
21     {
22         write(fd_send,buf,strlen(buf));
23         printf("begin read from pipe...\n");
24         memset(buf,0,1024);
25         read(fd_recv,buf,1024);
26         printf("from cl2:%s",buf);
27     }
28     close(fd_send);
29     close(fd_recv);
30     printf("pipe exit!\n");
31     return 0;

进程二:

 1 int main(int argc,char* argv[])
 2 {//cl2->cl1 cl1->cl2
 3     int fd_recv=open(argv[2],O_RDONLY);
 4     int fd_send=open(argv[1],O_WRONLY);
 5     if(-1==fd_send||-1==fd_recv)
 6     {
 7         perror("open");
 8         exit(1);
 9     }
10     printf("ok!\n");
11     char buf[1024];
12     while(printf("begin read from pipe...!\n"), memset(buf,0,1024),read(fd_recv,buf,1024)!=0)
13     {
14         printf("from cl1:%s",buf);
15         memset(buf,0,1024);
16         read(0,buf,1024);
17         write(fd_send,buf,strlen(buf));
18     }
19     close(fd_send);
20     close(fd_recv);
21     printf("pipe exit!\n");
22     return 0;
23 }

效果如图:

           

时间: 2024-11-09 13:48:46

利用命名管道实现进程间的通信(简单聊天程序的实现)的相关文章

进程间的通信简单总结

运行在不同的端系统的之间的通信: 进程指运行在端系统上的一个程序. 若要进行进程之间的通信,那么进程肯定就是成对出现的. 进程间的通信你可以想象是两个人用电话进行交流,然后它必须需要进行通信的一些基础设施,这个基础设施就是套接字,如果你在在两个进程之间进行数据交流,你可以把套接字想象成一个门,你打开门把你要传递的数据丢出去,然后另一个进程打开门,然后就收数据. 但是你把数据丢出门,它是如何找到目的地,另一个进程呢?数据报从一个进程找到另一个进程这就是进程寻址.你在打电话你需要提供电话号码,因此你

Linux进程间的通信

一.管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: A. 管道是半双工的,数据只能向一个方向流动: B. 需要双工通信时,需要建立起两个管道: C. 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): D. 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中. 匿名管道的创建:该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义;因此,一

进程间的通信——邮槽与命名管道d

进程间的通信是指在系统中两个或多个进程之间通过第三方进行数据共享. 1.邮槽. 邮槽是window系统提供的一种单向通信的机制.即进程中的一方只能写入或者读取数据,而另一方则只能读取或写入数据.通过邮槽,可以实现一对多或跨网络的进程之间的通信.但邮槽传输的数据量非常小,一般只有400KB左右. 邮槽创建函数CreateMailslot,函数原型: HANDLE CreateMailslot( LPCTSTR lpName, // mailslot name DWORD nMaxMessageSi

C#中使用命名管道进行进程通信的实例

原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 2 实现项目Client Client仅包含一个名为"客户端"的窗体,如下图所示. 编写窗体后端代码,如下所示. using System; using System.IO; using System.IO.Pipes; using Syste

进程间的通信:管道

进程间的通信:管道 Linux中将命令联系到一起使用实际上就是把一个进程的输出通过管道传递给另一个进程的输入,这些都是shell封装好的,对标准输入和输出流进行了重新连接,使数据流从键盘输入经过两个程序最终输出到屏幕上.如下: cmd1|cmd2 进程管道 在两个程序之间传递数据最简单的方法就是使用popen()和pclose()了.原型如下: #include <stdio.h> FILE *popen(const char *command, const char *open_mode);

管道实现进程间通讯 、WaitNamedPipe

一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能够分成两种,单向的双向的.依据管道的特点,命名管道通经常使用在网络环境下不同计算机上执行的进程之间的通信(当然也能够用在同一台机的不同进程中)它能够是单向或双向的:而匿名管道仅仅能用在同一台计算机中,它仅仅能是单向的.匿名管道事实上是通过用给了一个指定名字的有名管道来实现的. 使用管道的优点在于:读

邮槽 匿名管道 命名管道 剪贴板 进程通讯 转自http://www.cnblogs.com/kzloser/archive/2012/11/04/2753367.html#

邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系统所需要编写的代码非常少.如果读者是项目经理,就可以给你手下每一位员工的机器上安装上这个系统中的邮槽服务器端程序,在你自己的机器上安装油槽的客户端程序,这样,当你想通知员工开会,就可以通过自己安装的邮槽客户端程序.将开会这个消息发送出去,因为机器上都安装了邮槽服务器端的程序,所以他们都能同时收到你发

swoole进程间如何通信

Swoole进程间通信的方式 管道pipe 管道用于进程之间的数据交互,Linux系统本身提供了pipe函数用于创建一个半双工通信管道.半双工的通信方式中数据只能单向流动(一端只读一端只写),只能在具有亲缘关系(父子进程)的进程之间使用. 管道是进程间通信IPC中最基础的方式,管道有两种类型分别是命名管道.匿名管道. 匿名管道:专门用于具有血缘关系的进程之间,完成数据传递.命名管道:可以用在任何两个进程之间,Swoole中的管道都是匿名管道. 在Swoole中利用eventfd和UnixSock

linux 进程间的通信

现在linux使用的进程间通信方式:(1)管道(pipe)和有名管道(FIFO)(2)信号(signal)(3)消息队列(4)共享内存(5)信号量(6)套接字(socket) 为何进行进程间的通信:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到.C.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程).D.资源共享