linux下程式設計 作業系統 管道通訊

2022-06-23 16:33:13 字數 2037 閱讀 4140

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

2read( )

系統呼叫格式

read(fd,buf,nbyte)

功能:從fd所指示的檔案中讀出nbyte個位元組的資料,並將它們送至由指標buf所指示的緩衝區中。如該檔案被加鎖,等待,直到鎖開啟為止。

引數定義

int  read(fd,buf,nbyte);

int  fd;

char *buf;

unsigned  nbyte;

3write( )

系統呼叫格式

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);

}