資料介紹
8.7.1 管道通信實(shí)驗(yàn)
1.實(shí)驗(yàn)?zāi)康?br /> 通過編寫有名管道多路通信實(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é)中,通過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)測試該文件描述符是否準(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)行該程序。
?。?)另外打開兩個(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 /> 通過編寫有名管道多路通信實(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é)中,通過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)測試該文件描述符是否準(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)行該程序。
?。?)另外打開兩個(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在移動通信實(shí)驗(yàn)仿真中的應(yīng)用資料說明 6次下載
- 如何使用Labwindows CVI實(shí)現(xiàn)軟件無線電的通信實(shí)驗(yàn)系統(tǒng)的資料說明 7次下載
- 串口通信與串行通信的區(qū)別和寄存器及通信實(shí)驗(yàn)等詳細(xì)資料說明 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) 722次閱讀
- Jacinto 7核間通信解決方案 1226次閱讀
- 485通信實(shí)驗(yàn) 2515次閱讀
- CAN通信實(shí)驗(yàn) 3345次閱讀
- 如何使用消息隊(duì)列進(jìn)行通信 1436次閱讀
- 如何使用消息隊(duì)列進(jìn)行通信 1384次閱讀
- 進(jìn)程間通信的實(shí)現(xiàn)方式 771次閱讀
- Linux進(jìn)程間通信方法之管道 1997次閱讀
- 淺談進(jìn)程之間的通信方式 2834次閱讀
- 基于FPGA的UART串口通信實(shí)驗(yàn) 4399次閱讀
- 通信原理與matlab仿真之衛(wèi)星通信與數(shù)字調(diào)制 9251次閱讀
- Linux進(jìn)程的概念及進(jìn)程通信的應(yīng)用場景 6729次閱讀
- 深入理解51單片機(jī)串口通信及通信實(shí)例 2.7w次閱讀
- 進(jìn)程間與線程間的通信方式 8945次閱讀
- 單片機(jī)與PLC之間的串行通信實(shí)現(xiàn) 3.2w次閱讀
下載排行
本周
- 1GD100PIX120C6SNA規(guī)格書
- 0.98 MB | 3次下載 | 免費(fèi)
- 2一款入耳式耳機(jī)的仿真與分析
- 0.44 MB | 2次下載 | 免費(fèi)
- 3Eurotherm TKS Temperature 用戶手冊
- 1.46 MB | 2次下載 | 免費(fèi)
- 4人形機(jī)器人電機(jī)驅(qū)動和傳感報(bào)告
- 4.27 MB | 2次下載 | 免費(fèi)
- 5無線系統(tǒng)中天線和RF元件電磁建模
- 7.48 MB | 1次下載 | 4 積分
- 6Multisim模擬電路仿真教程
- 1.93 MB | 1次下載 | 3 積分
- 7DMP300C1型微機(jī)變壓器保護(hù)測控裝置技術(shù)說明書
- 4.11 MB | 次下載 | 10 積分
- 8用MT3540芯片設(shè)計(jì)BOOST電路 1(可下載)
- 445.66 KB | 次下載 | 免費(fèi)
本月
- 1晶體三極管的電流放大作用詳細(xì)說明
- 0.77 MB | 32次下載 | 2 積分
- 2Python從入門到精通背記手冊
- 18.77 MB | 27次下載 | 1 積分
- 3雙極型三極管放大電路的三種基本組態(tài)的學(xué)習(xí)課件免費(fèi)下載
- 4.03 MB | 25次下載 | 1 積分
- 4AIWA HS-J303 MKⅡ維修手冊
- 22.47 MB | 23次下載 | 10 積分
- 5多級放大電路的學(xué)習(xí)課件免費(fèi)下載
- 1.81 MB | 21次下載 | 2 積分
- 6九陽豆?jié){機(jī)高清原理圖
- 2.47 MB | 20次下載 | 1 積分
- 7AIWA HS-J202/HS-J202M/HS-J800維修手冊
- 13.60 MB | 15次下載 | 10 積分
- 81875功放原理圖
- 0.04 MB | 11次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191382次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183337次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81585次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73814次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論