日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發布時間:2023/11/27 生活经验 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux进程间通信:FIFO实现进程间的双向通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

fifo的雙向通信的方式如下圖:
兩個進程間的通信需要兩個命名管道,分別處理一個進程的讀和寫

導致這種通信方式出現的根因還是由于fifo的阻塞讀和阻塞寫,所以這里需要使用兩個管道對讀寫進行分別處理。
同時因為管道傳輸的數據為流式數據,則無法對數據進行指定標記(數據的發送者,接受者,大小。。。)。


SERVER端代碼如下:

/*************************************************************************> File Name: server.c> Author: > Mail: > Created Time: 三  9/25 08:34:44 2019************************************************************************/#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>#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\n");_exit(-1);}//服務端的子進程用來寫else if (ret == 0) {server_fd = open(FIFO_SERVER,O_WRONLY);if (-1 == server_fd) {printf("open FIFO_SERVER failed !\n");_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 \n");_exit(-1);}while (1) {memset(client_buf ,0 ,100);//不斷if (read(client_fd, client_buf, 100) > 0) printf("server : %s\n",client_buf);/*else {printf("read client_fd failed \n");_exit(-1);}*/}close(client_fd);} return 0;
}

CLIENT端代碼如下:

/*************************************************************************> File Name: server.c> Author: > Mail: > Created Time: 三  9/25 08:34:44 2019************************************************************************/#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>#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\n");_exit(-1);}//客戶端的子進程用來讀else if (ret == 0) {server_fd = open(FIFO_SERVER,O_RDONLY);if (-1 == server_fd) {printf("open FIFO_SERVER failed !\n");_exit(-1);}while(1) {memset (server_buf , 0 ,100);if (read(server_fd,server_buf,100) > 0) {printf("client:%s\n",server_buf);}/*else {printf("read from server_fd failed \n");_exit(-1);}*/}close(server_fd);}//父進程用來寫else {client_fd = open(FIFO_CLIENT,O_WRONLY);if (-1 == client_fd) {printf ("open FIFO_CLIENT failed \n");_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进程间通信:FIFO实现进程间的双向通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。