資料介紹
8.7.1 管道通信實驗
1.實驗?zāi)康?br /> 通過編寫有名管道多路通信實驗,讀者可進(jìn)一步掌握管道的創(chuàng)建、讀寫等操作,同時,也復(fù)習(xí)使用select()函數(shù)實現(xiàn)管道的通信。
2.實驗內(nèi)容
讀者還記得在6.3.3小節(jié)中,通過mknod命令創(chuàng)建兩個管道的實例嗎?本實例只是在它的基礎(chǔ)上添加有名管道的創(chuàng)建,而不用再輸入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 /* 緩沖區(qū)大小*/
#define IN_FILES 3 /* 多路復(fù)用輸入文件數(shù)目*/
#define TIME_DELAY 60 /* 超時值秒數(shù) */
#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;
/* 創(chuàng)建兩個有名管道 */
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,并在讀文件描述符集合中加入相應(yīng)的描述集*/
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;
/*循環(huán)測試該文件描述符是否準(zhǔn)備就緒,并調(diào)用select()函數(shù)對相關(guān)文件描述符做相應(yīng)操作*/
while(FD_ISSET(fds[0],&inset)
|| FD_ISSET(fds[1],&inset) || FD_ISSET(fds[2], &inset))
{
/* 文件描述符集合的備份, 免得每次進(jìn)行初始化 */
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;
}
?。?)編譯并運(yùn)行該程序。
(4)另外打開兩個虛擬終端,分別鍵入“cat 》 in1”和“cat 》 in2”,接著在該管道中鍵入相關(guān)內(nèi)容,并觀察實驗結(jié)果。
4.實驗結(jié)果
實驗運(yùn)行結(jié)果與第6章的例子完全相同。
$ 。/pipe_select (必須先運(yùn)行主程序)
SELECT CALL
select call
TEST PROGRAMME
test programme
END
end
q /* 在終端上輸入’q’或’Q’立刻結(jié)束程序運(yùn)行 */
$ cat 》 in1
SELECT CALL
TEST PROGRAMME
END
$ cat 》 in2
select call
test programme
end
1.實驗?zāi)康?br /> 通過編寫有名管道多路通信實驗,讀者可進(jìn)一步掌握管道的創(chuàng)建、讀寫等操作,同時,也復(fù)習(xí)使用select()函數(shù)實現(xiàn)管道的通信。
2.實驗內(nèi)容
讀者還記得在6.3.3小節(jié)中,通過mknod命令創(chuàng)建兩個管道的實例嗎?本實例只是在它的基礎(chǔ)上添加有名管道的創(chuàng)建,而不用再輸入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 /* 緩沖區(qū)大小*/
#define IN_FILES 3 /* 多路復(fù)用輸入文件數(shù)目*/
#define TIME_DELAY 60 /* 超時值秒數(shù) */
#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;
/* 創(chuàng)建兩個有名管道 */
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,并在讀文件描述符集合中加入相應(yīng)的描述集*/
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;
/*循環(huán)測試該文件描述符是否準(zhǔn)備就緒,并調(diào)用select()函數(shù)對相關(guān)文件描述符做相應(yīng)操作*/
while(FD_ISSET(fds[0],&inset)
|| FD_ISSET(fds[1],&inset) || FD_ISSET(fds[2], &inset))
{
/* 文件描述符集合的備份, 免得每次進(jìn)行初始化 */
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;
}
?。?)編譯并運(yùn)行該程序。
(4)另外打開兩個虛擬終端,分別鍵入“cat 》 in1”和“cat 》 in2”,接著在該管道中鍵入相關(guān)內(nèi)容,并觀察實驗結(jié)果。
4.實驗結(jié)果
實驗運(yùn)行結(jié)果與第6章的例子完全相同。
$ 。/pipe_select (必須先運(yùn)行主程序)
SELECT CALL
select call
TEST PROGRAMME
test programme
END
end
q /* 在終端上輸入’q’或’Q’立刻結(jié)束程序運(yùn)行 */
$ cat 》 in1
SELECT CALL
TEST PROGRAMME
END
$ cat 》 in2
select call
test programme
end
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 串口通信實驗資料分享 5次下載
- 串口通信實驗
- 實驗四、串口通信實驗
- STM32 串口通信實驗
- 嵌入式Linux進(jìn)程 -進(jìn)程間通信
- Simulink在移動通信實驗仿真中的應(yīng)用資料說明 6次下載
- 如何使用Labwindows CVI實現(xiàn)軟件無線電的通信實驗系統(tǒng)的資料說明 7次下載
- 串口通信與串行通信的區(qū)別和寄存器及通信實驗等詳細(xì)資料說明 11次下載
- Linux系統(tǒng)管道和有名管道的通信機(jī)制解析 0次下載
- 進(jìn)程間通信之Linux下進(jìn)程間通信概述 0次下載
- 進(jìn)程間通信之:管道 0次下載
- 光纖通信實驗講義V2015-9 2次下載
- CAN通信實驗 0次下載
- 光纖通信實驗指導(dǎo)書
- 光纖通信實驗
- 極化復(fù)用單載波高速率太赫茲光電融合通信實驗 722次閱讀
- Jacinto 7核間通信解決方案 1226次閱讀
- 485通信實驗 2515次閱讀
- CAN通信實驗 3345次閱讀
- 如何使用消息隊列進(jìn)行通信 1436次閱讀
- 如何使用消息隊列進(jìn)行通信 1384次閱讀
- 進(jìn)程間通信的實現(xiàn)方式 771次閱讀
- Linux進(jìn)程間通信方法之管道 1997次閱讀
- 淺談進(jìn)程之間的通信方式 2834次閱讀
- 基于FPGA的UART串口通信實驗 4399次閱讀
- 通信原理與matlab仿真之衛(wèi)星通信與數(shù)字調(diào)制 9251次閱讀
- Linux進(jìn)程的概念及進(jìn)程通信的應(yīng)用場景 6729次閱讀
- 深入理解51單片機(jī)串口通信及通信實例 2.7w次閱讀
- 進(jìn)程間與線程間的通信方式 8945次閱讀
- 單片機(jī)與PLC之間的串行通信實現(xiàn) 3.2w次閱讀
下載排行
本周
- 1EMC電路設(shè)計工程師必備的EMC基礎(chǔ)
- 0.42 MB | 4次下載 | 2 積分
- 2AU3116 2×60W模擬輸入雙通道Class-D 音頻功率放大器數(shù)據(jù)手冊
- 1.19 MB | 1次下載 | 免費
- 3低壓降肖特基整流管SR340L數(shù)據(jù)手冊
- 0.78 MB | 1次下載 | 免費
- 4ZX8002E 觸摸調(diào)光LED集成IC數(shù)據(jù)手冊
- 2.27 MB | 次下載 | 免費
- 5SOD-323塑料封裝ESD保護(hù)二極管SD05T系列規(guī)格書
- 1.07 MB | 次下載 | 免費
- 6SOT-23塑料封裝ESD保護(hù)二極管SMxx Series系列規(guī)格書
- 0.93 MB | 次下載 | 免費
- 7高效率整流二極管HER151 THRU HER158數(shù)據(jù)手冊
- 0.54 MB | 次下載 | 免費
- 8低壓降肖特基整流管SL22 THRU SL210數(shù)據(jù)手冊
- 1.03 MB | 次下載 | 免費
本月
- 1三相逆變主電路的原理圖和PCB資料合集免費下載
- 27.35 MB | 111次下載 | 1 積分
- 2運(yùn)算放大器基本電路中文資料
- 1.30 MB | 16次下載 | 免費
- 3蘋果iphone 11電路原理圖
- 4.98 MB | 11次下載 | 5 積分
- 4TL494工業(yè)用開關(guān)電源原理圖資料
- 0.22 MB | 10次下載 | 1 積分
- 5常用電子元器件介紹
- 3.21 MB | 8次下載 | 免費
- 6QW2893應(yīng)急燈專用檢測芯片
- 590.40 KB | 4次下載 | 免費
- 7相關(guān)協(xié)議信號總結(jié)
- 0.94 MB | 4次下載 | 免費
- 8EMC電路設(shè)計工程師必備的EMC基礎(chǔ)
- 0.42 MB | 4次下載 | 2 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935130次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191390次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183344次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81591次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費下載
- 0.02 MB | 73815次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65989次下載 | 10 積分
評論