1. 程式人生 > 其它 >作業系統——使用FIFO函式進行通訊,由程序A生產資料,由程序B讀取資料。

作業系統——使用FIFO函式進行通訊,由程序A生產資料,由程序B讀取資料。

作業系統——使用FIFO函式進行通訊,由程序A生產資料,由程序B讀取資料。

作業系統——使用FIFO函式進行通訊,由程序A生產資料,由程序B讀取資料。

1.直接跳轉到Linux端生產資料程式碼

2.直接跳轉到Linux端讀取資料程式碼


實驗結果

Linux效果圖(採用UOS + VScode + g++)



程式框圖(生產資料)



程式框圖(讀取資料)



C++程式碼(生產資料):

/*生產資料*/
#include <iostream>
#include<cstring>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define FIFO_NAME "/tmp/my_fifo"
using namespace std;
int main() {
	int pipe_fd;
	int res;
	string s="我是子程序"+to_string(getpid())+",^o^!";
	const char *buf;
	buf=s.c_str();
	//如果管道檔案不存在,就建立
	if(access(FIFO_NAME, F_OK)==-1) {
		res = mkfifo( FIFO_NAME, 0777 );
		//建立一個FIFO,如果建立成功,返回值為0
		if(res!=0) {
			cout<<"沒能成功建立FIFO:"<<FIFO_NAME<<endl;
			exit( EXIT_FAILURE );
			//表示異常退出
		}
	}
	cout<<"程序:"<<getpid()<<" 開啟FIFO管道:"<<FIFO_NAME<<endl;
	pipe_fd = open( FIFO_NAME, O_WRONLY );
	//以只寫方式開啟
	if(pipe_fd==-1 ) {
		cout<<"開啟失敗\n";
		exit( EXIT_FAILURE );
		//開啟失敗,異常退出
	} else {
		res=write( pipe_fd, buf, 30 );
		if(res==-1 ) {
			cout<<"寫失敗\n";
			exit( EXIT_FAILURE );
		}
		close( pipe_fd );
	}
	cout<<"程序:"<<getpid()<<" 寫結束 寫入的內容為:"<<buf<<endl;
	exit( EXIT_SUCCESS );
	//成功退出
}
//g++ test52.cpp -o test52&&./test52

C++程式碼(讀取資料):

/*讀取資料*/
#include <iostream>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define FIFO_NAME "/tmp/my_fifo"
using namespace std;
int main() {
	int pipe_fd;
	int res;
	char buf[30];
	cout<<"程序:"<<getpid()<<" 開啟FIFO管道:"<<FIFO_NAME<<endl;
	pipe_fd = open( FIFO_NAME,O_RDONLY );
	//以只讀方式開啟
	if(pipe_fd==-1) {
		cout<<"開啟失敗\n";
		exit( EXIT_FAILURE );
		//異常退出
	} else {
		res = read( pipe_fd, buf, 30);
		if( -1 == res ) {
			cout<<"讀失敗\n";
			exit( EXIT_FAILURE );
			//異常退出
		}
		close( pipe_fd );
	}
	cout<<"程序:"<<getpid()<<" 讀結束 讀出的內容為:"<<buf<<endl;
	exit( EXIT_SUCCESS );
	//成功退出
}
//g++ test521.cpp -o test521&&./test521