linux进程间通信:FIFO实现进程间的双向通信
生活随笔
收集整理的這篇文章主要介紹了
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实现进程间的双向通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个好听的健身房名字。
- 下一篇: linux进程间通信:system V消