作業系統——使用FIFO函式進行通訊,由程序A生產資料,由程序B讀取資料。
阿新 • • 發佈:2021-07-15
作業系統——使用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