資料介紹
8.7.1 管道通信實驗
1.實驗目的
通過編寫有名管道多路通信實驗,讀者可進一步掌握管道的創建、讀寫等操作,同時,也復習使用select()函數實現管道的通信。
2.實驗內容
讀者還記得在6.3.3小節中,通過mknod命令創建兩個管道的實例嗎?本實例只是在它的基礎上添加有名管道的創建,而不用再輸入mknod命令。
3.實驗步驟
(1)畫出流程圖。
該實驗流程圖如圖8.9所示。
圖8.9 8.6.1實驗流程圖
(2)編寫代碼。
該實驗源代碼如下所示。
/* pipe_select.c*/
#include 《fcntl.h》
#include 《stdio.h》
#include 《unistd.h》
#include 《stdlib.h》
#include 《string.h》
#include 《time.h》
#include 《errno.h》
#define FIFO1 “in1”
#define FIFO2 “in2”
#define MAX_BUFFER_SIZE 1024 /* 緩沖區大小*/
#define IN_FILES 3 /* 多路復用輸入文件數目*/
#define TIME_DELAY 60 /* 超時值秒數 */
#define MAX(a, b) ((a 》 b)?(a):(b))
int main(void)
{
int fds[IN_FILES];
char buf[MAX_BUFFER_SIZE];
int i, res, real_read, maxfd;
struct timeval tv;
fd_set inset,tmp_inset;
fds[0] = 0;
/* 創建兩個有名管道 */
if (access(FIFO1, F_OK) == -1)
{
if ((mkfifo(FIFO1, 0666) 《 0) && (errno != EEXIST))
{
printf(“Cannot create fifo file\n”);
exit(1);
}
}
if (access(FIFO2, F_OK) == -1)
{
if ((mkfifo(FIFO2, 0666) 《 0) && (errno != EEXIST))
{
printf(“Cannot create fifo file\n”);
exit(1);
}
}
/* 以只讀非阻塞方式打開兩個管道文件 */
if((fds[1] = open (FIFO1, O_RDONLY|O_NONBLOCK)) 《 0)
{
printf(“Open in1 error\n”);
return 1;
}
if((fds[2] = open (FIFO2, O_RDONLY|O_NONBLOCK)) 《 0)
{
printf(“Open in2 error\n”);
return 1;
}
/*取出兩個文件描述符中的較大者*/
maxfd = MAX(MAX(fds[0], fds[1]), fds[2]);
/*初始化讀集合inset,并在讀文件描述符集合中加入相應的描述集*/
FD_ZERO(&inset);
for (i = 0; i 《 IN_FILES; i++)
{
FD_SET(fds[i], &inset);
}
FD_SET(0, &inset);
tv.tv_sec = TIME_DELAY;
tv.tv_usec = 0;
/*循環測試該文件描述符是否準備就緒,并調用select()函數對相關文件描述符做相應操作*/
while(FD_ISSET(fds[0],&inset)
|| FD_ISSET(fds[1],&inset) || FD_ISSET(fds[2], &inset))
{
/* 文件描述符集合的備份, 免得每次進行初始化 */
tmp_inset = inset;
res = select(maxfd + 1, &tmp_inset, NULL, NULL, &tv);
switch(res)
{
case -1:
{
printf(“Select error\n”);
return 1;
}
break;
case 0: /* Timeout */
{
printf(“Time out\n”);
return 1;
}
break;
default:
{
for (i = 0; i 《 IN_FILES; i++)
{
if (FD_ISSET(fds[i], &tmp_inset))
{
memset(buf, 0, MAX_BUFFER_SIZE);
real_read = read(fds[i], buf, MAX_BUFFER_SIZE);
if (real_read 《 0)
{
if (errno != EAGAIN)
{
return 1;
}
}
else if (!real_read)
{
close(fds[i]);
FD_CLR(fds[i], &inset);
}
else
{
if (i == 0)
{/* 主程序終端控制 */
if ((buf[0] == ‘q’) || (buf[0] == ‘Q’))
{
return 1;
}
}
else
{/* 顯示管道輸入字符串 */
buf[real_read] = ‘\0’;
printf(“%s”, buf);
}
}
} /* end of if */
} /* end of for */
}
break;
} /* end of switch */
} /*end of while */
return 0;
}
(3)編譯并運行該程序。
(4)另外打開兩個虛擬終端,分別鍵入“cat 》 in1”和“cat 》 in2”,接著在該管道中鍵入相關內容,并觀察實驗結果。
4.實驗結果
實驗運行結果與第6章的例子完全相同。
$ 。/pipe_select (必須先運行主程序)
SELECT CALL
select call
TEST PROGRAMME
test programme
END
end
q /* 在終端上輸入’q’或’Q’立刻結束程序運行 */
$ cat 》 in1
SELECT CALL
TEST PROGRAMME
END
$ cat 》 in2
select call
test programme
end
1.實驗目的
通過編寫有名管道多路通信實驗,讀者可進一步掌握管道的創建、讀寫等操作,同時,也復習使用select()函數實現管道的通信。
2.實驗內容
讀者還記得在6.3.3小節中,通過mknod命令創建兩個管道的實例嗎?本實例只是在它的基礎上添加有名管道的創建,而不用再輸入mknod命令。
3.實驗步驟
(1)畫出流程圖。
該實驗流程圖如圖8.9所示。
圖8.9 8.6.1實驗流程圖
(2)編寫代碼。
該實驗源代碼如下所示。
/* pipe_select.c*/
#include 《fcntl.h》
#include 《stdio.h》
#include 《unistd.h》
#include 《stdlib.h》
#include 《string.h》
#include 《time.h》
#include 《errno.h》
#define FIFO1 “in1”
#define FIFO2 “in2”
#define MAX_BUFFER_SIZE 1024 /* 緩沖區大小*/
#define IN_FILES 3 /* 多路復用輸入文件數目*/
#define TIME_DELAY 60 /* 超時值秒數 */
#define MAX(a, b) ((a 》 b)?(a):(b))
int main(void)
{
int fds[IN_FILES];
char buf[MAX_BUFFER_SIZE];
int i, res, real_read, maxfd;
struct timeval tv;
fd_set inset,tmp_inset;
fds[0] = 0;
/* 創建兩個有名管道 */
if (access(FIFO1, F_OK) == -1)
{
if ((mkfifo(FIFO1, 0666) 《 0) && (errno != EEXIST))
{
printf(“Cannot create fifo file\n”);
exit(1);
}
}
if (access(FIFO2, F_OK) == -1)
{
if ((mkfifo(FIFO2, 0666) 《 0) && (errno != EEXIST))
{
printf(“Cannot create fifo file\n”);
exit(1);
}
}
/* 以只讀非阻塞方式打開兩個管道文件 */
if((fds[1] = open (FIFO1, O_RDONLY|O_NONBLOCK)) 《 0)
{
printf(“Open in1 error\n”);
return 1;
}
if((fds[2] = open (FIFO2, O_RDONLY|O_NONBLOCK)) 《 0)
{
printf(“Open in2 error\n”);
return 1;
}
/*取出兩個文件描述符中的較大者*/
maxfd = MAX(MAX(fds[0], fds[1]), fds[2]);
/*初始化讀集合inset,并在讀文件描述符集合中加入相應的描述集*/
FD_ZERO(&inset);
for (i = 0; i 《 IN_FILES; i++)
{
FD_SET(fds[i], &inset);
}
FD_SET(0, &inset);
tv.tv_sec = TIME_DELAY;
tv.tv_usec = 0;
/*循環測試該文件描述符是否準備就緒,并調用select()函數對相關文件描述符做相應操作*/
while(FD_ISSET(fds[0],&inset)
|| FD_ISSET(fds[1],&inset) || FD_ISSET(fds[2], &inset))
{
/* 文件描述符集合的備份, 免得每次進行初始化 */
tmp_inset = inset;
res = select(maxfd + 1, &tmp_inset, NULL, NULL, &tv);
switch(res)
{
case -1:
{
printf(“Select error\n”);
return 1;
}
break;
case 0: /* Timeout */
{
printf(“Time out\n”);
return 1;
}
break;
default:
{
for (i = 0; i 《 IN_FILES; i++)
{
if (FD_ISSET(fds[i], &tmp_inset))
{
memset(buf, 0, MAX_BUFFER_SIZE);
real_read = read(fds[i], buf, MAX_BUFFER_SIZE);
if (real_read 《 0)
{
if (errno != EAGAIN)
{
return 1;
}
}
else if (!real_read)
{
close(fds[i]);
FD_CLR(fds[i], &inset);
}
else
{
if (i == 0)
{/* 主程序終端控制 */
if ((buf[0] == ‘q’) || (buf[0] == ‘Q’))
{
return 1;
}
}
else
{/* 顯示管道輸入字符串 */
buf[real_read] = ‘\0’;
printf(“%s”, buf);
}
}
} /* end of if */
} /* end of for */
}
break;
} /* end of switch */
} /*end of while */
return 0;
}
(3)編譯并運行該程序。
(4)另外打開兩個虛擬終端,分別鍵入“cat 》 in1”和“cat 》 in2”,接著在該管道中鍵入相關內容,并觀察實驗結果。
4.實驗結果
實驗運行結果與第6章的例子完全相同。
$ 。/pipe_select (必須先運行主程序)
SELECT CALL
select call
TEST PROGRAMME
test programme
END
end
q /* 在終端上輸入’q’或’Q’立刻結束程序運行 */
$ cat 》 in1
SELECT CALL
TEST PROGRAMME
END
$ cat 》 in2
select call
test programme
end
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 串口通信實驗資料分享 5次下載
- 串口通信實驗
- 實驗四、串口通信實驗
- STM32 串口通信實驗
- 嵌入式Linux進程 -進程間通信
- Simulink在移動通信實驗仿真中的應用資料說明 6次下載
- 如何使用Labwindows CVI實現軟件無線電的通信實驗系統的資料說明 7次下載
- 串口通信與串行通信的區別和寄存器及通信實驗等詳細資料說明 11次下載
- Linux系統管道和有名管道的通信機制解析 0次下載
- 進程間通信之Linux下進程間通信概述 0次下載
- 進程間通信之:管道 0次下載
- 光纖通信實驗講義V2015-9 2次下載
- CAN通信實驗 0次下載
- 光纖通信實驗指導書
- 光纖通信實驗
- 極化復用單載波高速率太赫茲光電融合通信實驗 446次閱讀
- Jacinto 7核間通信解決方案 1058次閱讀
- 485通信實驗 2036次閱讀
- CAN通信實驗 2870次閱讀
- 如何使用消息隊列進行通信 1304次閱讀
- 如何使用消息隊列進行通信 1193次閱讀
- 進程間通信的實現方式 696次閱讀
- Linux進程間通信方法之管道 1820次閱讀
- 淺談進程之間的通信方式 2783次閱讀
- 基于FPGA的UART串口通信實驗 4259次閱讀
- 通信原理與matlab仿真之衛星通信與數字調制 9075次閱讀
- Linux進程的概念及進程通信的應用場景 6622次閱讀
- 深入理解51單片機串口通信及通信實例 2.7w次閱讀
- 進程間與線程間的通信方式 8817次閱讀
- 單片機與PLC之間的串行通信實現 3.1w次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多