首页 > linux进程间通信:FIFO实现进程间的双向通信

linux进程间通信:FIFO实现进程间的双向通信

fifo的双向通信的方式如下图:

两个进程间的通信需要两个命名管道,分别处理一个进程的读和写

导致这种通信方式出现的根因还是由于fifo的阻塞读和阻塞写,所以这里需要使用两个管道对读写进行分别处理。

同时因为管道传输的数据为流式数据,则无法对数据进行指定标记(数据的发送者,接受者,大小。。。)。

在这里插入图片描述

SERVER端代码如下:

/*************************************************************************> File Name: server.c> Author: > Mail: > Created Time: 三  9/25 08:34:44 2019************************************************************************/#include
#include
#include 
#include 
#include 
#include 
#include #define FIFO_SERVER "fifoserver"
#define FIFO_CLIENT "fifoclient"
int main()
{ mkfifo(FIFO_SERVER,0644);mkfifo(FIFO_CLIENT,0644);int server_fd,client_fd,ret;char server_buf[100], client_buf[100];ret = fork();if (ret == -1) { printf("fork failed
");_exit(-1);}//服务端的子进程用来写else if (ret == 0) { server_fd = open(FIFO_SERVER,O_WRONLY);if (-1 == server_fd) { printf("open FIFO_SERVER failed !
");_exit(-1);}while(1) { memset (server_buf , 0 ,100);scanf("%s",server_buf);write(server_fd,server_buf,strlen(server_buf));}close(server_fd);}//服务端的父进程用来读else { client_fd = open(FIFO_CLIENT,O_RDONLY);if (-1 == client_fd) { printf ("open FIFO_CLIENT failed 
");_exit(-1);}while (1) { memset(client_buf ,0 ,100);//不断if (read(client_fd, client_buf, 100) > 0) printf("server : %s
",client_buf);/*else {printf("read client_fd failed 
");_exit(-1);}*/}close(client_fd);} return 0;
}

CLIENT端代码如下:

/*************************************************************************> File Name: server.c> Author: > Mail: > Created Time: 三  9/25 08:34:44 2019************************************************************************/#include
#include
#include 
#include 
#include 
#include 
#include #define FIFO_SERVER "fifoserver"
#define FIFO_CLIENT "fifoclient"
int main()
{ //创建管道mkfifo(FIFO_SERVER,0644);mkfifo(FIFO_CLIENT,0644);int server_fd,client_fd,ret;char server_buf[100], client_buf[100];ret = fork();if (ret == -1) { printf("fork failed
");_exit(-1);}//客户端的子进程用来读else if (ret == 0) { server_fd = open(FIFO_SERVER,O_RDONLY);if (-1 == server_fd) { printf("open FIFO_SERVER failed !
");_exit(-1);}while(1) { memset (server_buf , 0 ,100);if (read(server_fd,server_buf,100) > 0) { printf("client:%s
",server_buf);}/*else {printf("read from server_fd failed 
");_exit(-1);}*/}close(server_fd);}//父进程用来写else { client_fd = open(FIFO_CLIENT,O_WRONLY);if (-1 == client_fd) { printf ("open FIFO_CLIENT failed 
");_exit(-1);}while (1) { memset(client_buf ,0 ,100);scanf("%s",client_buf);write(client_fd, client_buf, strlen(client_buf)); }close(client_fd);} return 0;
}

运行结果如下:

在这里插入图片描述

更多相关:

  • 文章目录介绍重定向函数介绍总结 linux terminal输入如下命令,其中"|"符号即为我们上文中所说的无名管道 介绍 正如我们上文中所描述的"|“无名管道提供了具有亲缘关系的进程之间的通信,它由于直接使用系统调用,运行效率较高。则linux系统下可以大批量的使用”|"来提供命令直接输入输出的重定向。 具体sh...

  • 2019独角兽企业重金招聘Python工程师标准>>> fd_set 结构,是一个数字。 文件描述符fd的值 不能超过1024,而不是数量不能超过1024。 在开发打开句柄多的程序时,最好不要使用select。否则就使用多进程开发。 /usr/include/X11 Xpoll.h 文件 #ifndef _XPOLL_H_#...

  • 自定义日志域Custom Logging Fields 下面的字段描述了ATS支持的自定义日志域 {HTTP header field name}cqh {HTTP header field name}pqh {HTTP header field name}psh {HTTP header field name}ssh...

  • 下面是几个常用命令行工具,先截图,再描述 在生成环境调试的命令 sudo gdb ./traffic_server -p $(pidof traffic_server)  -batch  -x  [macro_file] 参考文献 [1].ATS Debugging Fall Summ...

  • Page1.aspx:   <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Page1.aspx.cs" Inherits="Application.跨页面传送.Page1" %>  

  • 在下面的例子中,我们在一个 .aspx 文件中声明了一个 TextBox 控件和一个 Label 控件。当您更改了 TextBox 中的值,并且在 TextBox 外单击时,change 子例程就会被执行。change 子例程会向 Label 控件写一条文本: