Linux系統程式設計之程式間通訊方式:命名管道(二)
命名管道的預設操作
2)假如FIFO裡沒有資料,呼叫read()函式從FIFO裡讀資料時read()也會阻塞。這個特點和無名管道是一樣的。
寫端程式碼如下:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char*argv[])
{
int fd;
int ret;
ret=mkfifo("my_fifo",0666);//建立命名管道
if(ret!=0)
{
perror("mkfifo");
}
printf("before open\n");
fd=open("my_fifo",O_WRONLY);//等著只讀
if(fd<0)
{
perror("open fifo");
}
printf("after open\n");
printf("before write\n");
//5s後才往命名管道寫資料,沒資料前,讀端read()阻塞
sleep(5);
char send[100]="Hello Mike";
write(fd,send,strlen(send));
printf("write to my_fifo buf=%s\n",send);
return 0;
}
讀端程式碼如下:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char*argv[])
{
int fd;
int ret;
ret=mkfifo("my_fifo",0666);//建立命名管道
if(ret!=0)
{
perror("mkfifo");
}
printf("before open\n");
fd=open("my_fifo",O_RDONLY);//等著只寫
if(fd<0)
{
perror("open fifo");
}
printf("after open\n");
printf("before read\n");
char recv[100]={0};
//讀資料,命名管道沒資料時會阻塞,有資料時就取出來
read(fd,recv,sizeof(recv));
printf("read from my_fifo buf=[%s]\n",recv);
return 0;
}
請根據下圖自行編譯執行驗證:
3)通訊過程中若寫程式先退出了,就算命名管道里沒有資料,呼叫read()函式從FIFO裡讀資料時不阻塞;若寫程式又重新執行,則呼叫read()函式從FIFO裡讀資料時又恢復阻塞。
寫端程式碼如下:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char*argv[])
{
int fd;
int ret;
ret=mkfifo("my_fifo",0666);//建立命名管道
if(ret!=0)
{
perror("mkfifo");
}
fd=open("my_fifo",O_WRONLY);//等著只讀
if(fd<0)
{
perror("open fifo");
}
char send[100]="Hello Mike";
write(fd,send,strlen(send));//寫資料
printf("write to my_fifo buf=%s\n",send);
while(1);//阻塞,保證讀寫程式保持著通訊過程
return 0;
}
讀端程式碼如下:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char*argv[])
{
int fd;
int ret;
ret=mkfifo("my_fifo",0666);//建立命名管道
if(ret!=0)
{
perror("mkfifo");
}
fd=open("my_fifo",O_RDONLY);//等著只寫
if(fd<0)
{
perror("open fifo");
}
while(1)
{
char recv[100]={0};
read(fd,recv,sizeof(recv));//讀資料
printf("read from my_fifo buf=[%s]\n",recv);
sleep(1);
}
return 0;
}
請根據下圖自行編譯執行驗證:
5)通訊過程中,讀程式退出後,寫程式向命名管道內寫資料時,寫程式也會(收到SIGPIPE訊號)退出。
6)呼叫write()函式向FIFO裡寫資料,當緩衝區已滿時write()也會阻塞。
5)和6)這兩個特點和無名管道是一樣的,這裡不再驗證,詳情請看《無名管道》。
命名管道非阻塞標誌操作
命名管道可以以非阻塞標誌(O_NONBLOCK)方式開啟:
fd=open("my_fifo",O_WRONLY|O_NONBLOCK);
fd=open("my_fifo",O_RDONLY|O_NONBLOCK);
非阻塞標誌(O_NONBLOCK)開啟的命名管道有以下特點:
1、先以只讀方式開啟,如果沒有程式已經為寫而開啟一個FIFO,只讀open()成功,並且open()不阻塞。
2、先以只寫方式開啟,如果沒有程式已經為讀而開啟一個FIFO,只寫open()將出錯返回-1。
3、read()、write()讀寫命名管道中讀資料時不阻塞。
請根據以下程式碼自行編譯執行驗證。
寫端程式碼如下:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char*argv[])
{
int fd;
int ret;
ret=mkfifo("my_fifo",0666);//建立命名管道
if(ret!=0)
{
perror("mkfifo");
}
//只寫並指定非阻塞方式開啟
fd=open("my_fifo",O_WRONLY|O_NONBLOCK);
if(fd<0)
{
perror("open fifo");
}
char send[100]="Hello Mike";
write(fd,send,strlen(send));
printf("write to my_fifo buf=%s\n",send);
while(1);
return 0;
}
讀端程式碼如下:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char*argv[])
{
int fd;
int ret;
ret=mkfifo("my_fifo",0666);//建立命名管道
if(ret!=0)
{
perror("mkfifo");
}
//只讀並指定非阻塞方式開啟
fd=open("my_fifo",O_RDONLY|O_NONBLOCK);
if(fd<0)
{
perror("open fifo");
}
while(1)
{
char recv[100]={0};
read(fd,recv,sizeof(recv));
printf("read from my_fifo buf=[%s]\n",recv);
sleep(1);
}
return 0;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2656894/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux系統程式設計之程式間通訊方式:命名管道(一)Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(一)Linux程式設計
- Linux系統程式設計之程式間通訊方式:訊息佇列Linux程式設計佇列
- linux 程式間通訊之管道Linux
- 系統程式設計——管道通訊程式設計
- Linux系統程式設計之命名管道與共享記憶體Linux程式設計記憶體
- Linux系統程式設計之程式間通訊方式:共享記憶體例項演示Linux程式設計記憶體
- Linux系統程式設計之匿名管道Linux程式設計
- Linux 的程式間通訊:管道Linux
- Linux程式間通訊②:有名管道FIFOLinux
- linux程式間通訊--管道(PIPE & FIFO)Linux
- 【linux】系統程式設計-1-程式、管道和訊號Linux程式設計
- Linux系統程式設計—有名管道Linux程式設計
- Linux作業系統 程式之間的通訊Linux作業系統
- 溫故之.NET程式間通訊——管道
- 利用windows api實現程式通訊(命名管道)WindowsAPI
- 什麼是程式間通訊?Linux程式間通訊有幾種方式?Linux
- 程式間通訊是什麼?Linux程式間通訊有幾種方式?Linux
- linux 程式間通訊之FIFOLinux
- Linux程式之間如何通訊?Linux
- Linux 下的程式間通訊:使用管道和訊息佇列Linux佇列
- Linux環境程式設計程式間通訊機制理解Linux程式設計
- Linux系統程式設計之程式介紹Linux程式設計
- linux環境程式設計(2): 使用pipe完成程式間通訊Linux程式設計
- 程式間通訊——LINUXLinux
- Linux程式間通訊Linux
- Linux系統程式設計——特殊程式之孤兒程式Linux程式設計
- 【Linux系統程式設計】Linux訊號列表Linux程式設計
- Linux系統程式設計:訊號捕捉Linux程式設計
- Linux系統程式設計—訊號捕捉Linux程式設計
- linux環境程式設計(3): 使用POSIX IPC完成程式間通訊Linux程式設計
- 20.2、python程式間通訊——佇列和管道Python佇列
- Linux程式間的通訊方式有哪些?Linux入門教程Linux
- Linux 程式間通訊之System V 訊號量Linux
- 程式間通訊方式有哪些?
- Linux程式設計之gdb(二)Linux程式設計
- Linux程式間通訊-eventfdLinux