1、有名管道
乙個可以在檔案系統中長期存在的、具有路徑名的檔案。用系統呼叫mknod( )建立。它克服無名管道使用上的侷限性,可讓更多的程序也能利用管道進行通訊。因而其它程序可以知道它的存在,並能利用路徑名來訪問該檔案。對有名管道的訪問方式與訪問其他檔案一樣,需先用open( )開啟。
2、無名管道
乙個臨時檔案。利用pipe( )建立起來的無名檔案(無路徑名)。只用該系統呼叫所返回的檔案描述符來標識該檔案,故只有呼叫pipe( )的程序及其子孫程序才能識別此檔案描述符,才能利用該檔案(管道)進行通訊。當這些程序不再使用此管道時,核心收回其索引結點。
3、pipe檔案的建立
分配磁碟和記憶體索引結點、為讀程序分配檔案表項、為寫程序分配檔案表項、分配使用者檔案描述符
4、讀/寫程序互斥
核心為位址設定乙個讀指標和乙個寫指標,按先進先出順序讀、寫。
為使讀、寫程序互斥地訪問pipe檔案,需使各程序互斥地訪問pipe檔案索引結點中的直接位址項。因此,每次程序在訪問pipe檔案前,都需檢查該索引檔案是否已被上鎖。若是,程序便睡眠等待,否則,將其上鎖,進行讀/寫。操作結束後解鎖,並喚醒因該索引結點上鎖而睡眠的程序。
1、pipe( )
建立一無名管道。
系統呼叫格式
pipe(filedes)
引數定義
int pipe(filedes);
int filedes[2];
其中,filedes[1]是寫入端,filedes[0]是讀出端。
該函式使用標頭檔案如下:
#include
#inlcude
#include
2、read( )
系統呼叫格式
read(fd,buf,nbyte)
功能:從fd所指示的檔案中讀出nbyte個位元組的資料,並將它們送至由指標buf所指示的緩衝區中。如該檔案被加鎖,等待,直到鎖開啟為止。
引數定義
int read(fd,buf,nbyte);
int fd;
char *buf;
unsigned nbyte;
3、write( )
系統呼叫格式
read(fd,buf,nbyte)
功能:把nbyte 個位元組的資料,從buf所指向的緩衝區寫到由fd所指向的檔案中。如檔案加鎖,暫停寫入,直至開鎖。
引數定義同read( )。
無名管道程式原始碼:
#include #include#include
#include
intpid1,pid2;
intmain()
else
else
}}
有名管道程式原始碼:
#include #include#include
#include
#include
#include
intpid1,pid2;
intmain()
int fd = open(filename,o_rdwr);//
開啟檔案
if(fd < 0
)
while((pid1=fork()) == -1);//
建立子程序1
if(pid1 == 0
)
else
else
; len = read(fd,buf,sizeof(buf) - 1
); printf(
"%s\n
",buf);}}
close(fd);
unlink(filename);
}
linux作業系統管理
linux作業系統管理命令 lsusb 該命令能夠列印出usb控制器和sub相關的裝置資訊,lsusb v 則列印出詳細資訊 lscpu 此命令能夠檢視到cpu和處理單元的資訊,cat proc cpuinfo 此命令也可做參考 lspci是另乙個命令列工具,可以用來列出所有的 pci 匯流排,還有...
作業系統實驗(15 16)匿名管道與命名管道通訊
include include include include include intmain printf pipe create success n if fork 0 else close pipe fd 0 close pipe fd 1 return0 分析 父程序通過pipe 呼叫申請建...
作業系統 管程
在前面 程序 中提到,有訊號量與互斥量之後,似乎程序間通訊就很容易了。但事實上並不然,pv操作不慎是很容易導致兩個程序都被阻塞的,這種情況就叫做死鎖 dead lock 為了更容易編寫出正確的程式,1973和1974年hansen與hoare提出了另一種高階同步原語,稱為管程 monitor 但他們...