資料介紹
8.7.1 管道通信實(shí)驗(yàn)
1.實(shí)驗(yàn)?zāi)康?br /> 通過(guò)編寫有名管道多路通信實(shí)驗(yàn),讀者可進(jìn)一步掌握管道的創(chuàng)建、讀寫等操作,同時(shí),也復(fù)習(xí)使用select()函數(shù)實(shí)現(xiàn)管道的通信。
2.實(shí)驗(yàn)內(nèi)容
讀者還記得在6.3.3小節(jié)中,通過(guò)mknod命令創(chuàng)建兩個(gè)管道的實(shí)例嗎?本實(shí)例只是在它的基礎(chǔ)上添加有名管道的創(chuàng)建,而不用再輸入mknod命令。
3.實(shí)驗(yàn)步驟
?。?)畫出流程圖。
該實(shí)驗(yàn)流程圖如圖8.9所示。
圖8.9 8.6.1實(shí)驗(yàn)流程圖
?。?)編寫代碼。
該實(shí)驗(yàn)源代碼如下所示。
/* 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í)值秒數(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)建兩個(gè)有名管道 */
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);
}
}
/* 以只讀非阻塞方式打開兩個(gè)管道文件 */
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;
}
/*取出兩個(gè)文件描述符中的較大者*/
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)測(cè)試該文件描述符是否準(zhǔn)備就緒,并調(diào)用select()函數(shù)對(duì)相關(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;
}
(3)編譯并運(yùn)行該程序。
?。?)另外打開兩個(gè)虛擬終端,分別鍵入“cat 》 in1”和“cat 》 in2”,接著在該管道中鍵入相關(guān)內(nèi)容,并觀察實(shí)驗(yàn)結(jié)果。
4.實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)運(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.實(shí)驗(yàn)?zāi)康?br /> 通過(guò)編寫有名管道多路通信實(shí)驗(yàn),讀者可進(jìn)一步掌握管道的創(chuàng)建、讀寫等操作,同時(shí),也復(fù)習(xí)使用select()函數(shù)實(shí)現(xiàn)管道的通信。
2.實(shí)驗(yàn)內(nèi)容
讀者還記得在6.3.3小節(jié)中,通過(guò)mknod命令創(chuàng)建兩個(gè)管道的實(shí)例嗎?本實(shí)例只是在它的基礎(chǔ)上添加有名管道的創(chuàng)建,而不用再輸入mknod命令。
3.實(shí)驗(yàn)步驟
?。?)畫出流程圖。
該實(shí)驗(yàn)流程圖如圖8.9所示。
圖8.9 8.6.1實(shí)驗(yàn)流程圖
?。?)編寫代碼。
該實(shí)驗(yàn)源代碼如下所示。
/* 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í)值秒數(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)建兩個(gè)有名管道 */
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);
}
}
/* 以只讀非阻塞方式打開兩個(gè)管道文件 */
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;
}
/*取出兩個(gè)文件描述符中的較大者*/
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)測(cè)試該文件描述符是否準(zhǔn)備就緒,并調(diào)用select()函數(shù)對(duì)相關(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;
}
(3)編譯并運(yùn)行該程序。
?。?)另外打開兩個(gè)虛擬終端,分別鍵入“cat 》 in1”和“cat 》 in2”,接著在該管道中鍵入相關(guān)內(nèi)容,并觀察實(shí)驗(yàn)結(jié)果。
4.實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)運(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
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 串口通信實(shí)驗(yàn)資料分享 5次下載
- 串口通信實(shí)驗(yàn)
- 實(shí)驗(yàn)四、串口通信實(shí)驗(yàn)
- STM32 串口通信實(shí)驗(yàn)
- 嵌入式Linux進(jìn)程 -進(jìn)程間通信
- Simulink在移動(dòng)通信實(shí)驗(yàn)仿真中的應(yīng)用資料說(shuō)明 6次下載
- 如何使用Labwindows CVI實(shí)現(xiàn)軟件無(wú)線電的通信實(shí)驗(yàn)系統(tǒng)的資料說(shuō)明 7次下載
- 串口通信與串行通信的區(qū)別和寄存器及通信實(shí)驗(yàn)等詳細(xì)資料說(shuō)明 11次下載
- Linux系統(tǒng)管道和有名管道的通信機(jī)制解析 0次下載
- 進(jìn)程間通信之Linux下進(jìn)程間通信概述 0次下載
- 進(jìn)程間通信之:管道 0次下載
- 光纖通信實(shí)驗(yàn)講義V2015-9 2次下載
- CAN通信實(shí)驗(yàn) 0次下載
- 光纖通信實(shí)驗(yàn)指導(dǎo)書
- 光纖通信實(shí)驗(yàn)
- 極化復(fù)用單載波高速率太赫茲光電融合通信實(shí)驗(yàn) 446次閱讀
- Jacinto 7核間通信解決方案 1058次閱讀
- 485通信實(shí)驗(yàn) 2036次閱讀
- CAN通信實(shí)驗(yàn) 2870次閱讀
- 如何使用消息隊(duì)列進(jìn)行通信 1304次閱讀
- 如何使用消息隊(duì)列進(jìn)行通信 1193次閱讀
- 進(jìn)程間通信的實(shí)現(xiàn)方式 696次閱讀
- Linux進(jìn)程間通信方法之管道 1820次閱讀
- 淺談進(jìn)程之間的通信方式 2783次閱讀
- 基于FPGA的UART串口通信實(shí)驗(yàn) 4259次閱讀
- 通信原理與matlab仿真之衛(wèi)星通信與數(shù)字調(diào)制 9075次閱讀
- Linux進(jìn)程的概念及進(jìn)程通信的應(yīng)用場(chǎng)景 6622次閱讀
- 深入理解51單片機(jī)串口通信及通信實(shí)例 2.7w次閱讀
- 進(jìn)程間與線程間的通信方式 8817次閱讀
- 單片機(jī)與PLC之間的串行通信實(shí)現(xiàn) 3.1w次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多