Linux程序間通訊 1 管道

2022-02-13 14:04:18 字數 3540 閱讀 7876

linux程序間通訊:

1、同主機程序間資料互動機制:無名管道(pipe)、有名管道(fifo)、訊息佇列(message queue)和共享記憶體(share memory)。

2、同主機程序間同步機制:訊號量(semaphore)。

3、同主機程序間非同步機制:訊號(signal)。

4、網路主機間資料互動機制:套接字(socket)

無名管道(pipe):

首先是 int pipe(int f[2]) 這個函式,其需要標頭檔案,這個函式將建立乙個未命名管道,並將管道的讀端描述字包含在f[0]中,將寫端描述字放在f[1]中,然後你就可以像利用普通檔案描述字一樣來讀寫資料了。

再次是int close(int fd) 函式, 其需要標頭檔案,其用於關閉指定的檔案描述字。

最後是write和read函式, 其需要標頭檔案,用於讀寫資料。

無名管道的特點:

1、管道是半雙工的,資料只能向乙個方向流動,具有固定的讀端和寫端;需要雙方通訊時,需要建立起兩個管道;

2、只能用於父子程序或者兄弟程序之間(具有親緣關係的程序);

3、單獨構成一種獨立的檔案系統:管道對於管道兩端的程序而言,就是乙個檔案,但它不是普通的檔案,它不屬於某種檔案系統,而是單獨構成一種檔案系統,並且只存在與記憶體中。

4、資料的讀出和寫入:乙個程序向管道中寫的內容被管道另一端的程序讀出。寫入的內容每次都新增在管道緩衝區的末尾,並且每次都是從緩衝區的頭部讀出資料。

管道讀寫注意點:

只有在管道的讀端存在時,向管道寫入資料才有意義。否則向管道寫入資料的程序將收到核心傳來的sigpipe訊號(通常為broken pipe錯誤);

向管道寫入資料時,linux將不保證寫入的原子性,管道緩衝區一有空閒區域,寫程序就會試圖向管道寫入資料。如果讀程序不讀取管道緩衝區中的資料,那麼寫操作將會一直阻塞;

父子程序在執行時,它們的先後順序並不能保證。

/*pipe.c*/

#include #include 

#include

#include

#define buff_sz 256

intmain()

//fork an new process

if(0 == (pid=fork()))//建立乙個子程序

//close read-point of pipe in child process

close(pipe_fd[0

]);//關閉子程序讀描述符

exit(0);

}//close read-point of pipe in parent process

close(pipe_fd[0

]);

//write bytes to write-point of pipe in parent process

if((bytes_write = write(pipe_fd[1

], data, strlen(data))))

//close write-point of pipe in parent process

close(pipe_fd[1

]);

//wait child process exit

waitpid(pid, null, 0

);//收集子程序退出資訊

printf(""

);

return0;

}

標準流管道:標準流管道完成的工作:

建立乙個管道;

fork()乙個子程序;

在父子程序中關閉不需要的檔案描述符;

執行exec()函式族呼叫;

執行函式中所呼叫的指令。

使用例項:

/*

standard_pipe.c

*/#include

#include

#include

#include

#define bufsize 1024

intmain()

while((fgets(buf,bufsize,fd)) !=null)

pclose(fd);

//關閉流管道

exit(0

);}

有名管道(fifo):它可以使不相關的兩個程序實現彼此通訊;

該管道可以通過路徑名來指出,並且在檔案系統中是可見的。在建立了管道之後,兩個程序就可以把它當作普通檔案一樣進行讀寫操作,使用非常方便;

fifo嚴格地遵循先進先出規則,對管道及fifo的讀總是從開始處返回資料,對它們的寫則是把資料新增到末尾,它們不支援如 lseek() 等檔案操作。

函式 int mkfifo (char* path, mode_t mode) 負責建立fifo管道,其需要標頭檔案,引數path即要建立的管道檔案存放位置,mode引數即檔案許可權。

更多的參考:     fifo管道建立完成以後,便可以使用open函式來開啟它,然後進行讀寫操作了。

/*

fifo_write.c

*/#include

#include

#include

#include

#include

#include

#include

#include

#define buffer_size pipe_buf

#define fifo_name "/tmp/my_fifo"

int

main()

//open fifo pipe file.

pipe_fd =open(fifo_name, o_wronly);

//write data into pipe

write(pipe_fd, "

hi, this is a test

", pipe_buf);

//close fifo pipe file descriptor

close(pipe_fd);

return0;

}

/*

fifo_read.c

*/#include

#include

#include

#include

#include

#include

#include

#include

#define fifo_name "/tmp/my_fifo"

#define buffer_size pipe_buf

intmain()

//close pipe file descriptor

close(pipe_fd);

return0;

}

Linux 程序間通訊 1 管道

1.匿名管道 include 功能 建立匿名管道 int pipe int fd 2 引數fd 檔案描述符陣列,其中fd 0 表示讀端,fd 1 表示寫端 返回值 成功返回0,失敗返回 1管道並非屬於程序的資源,屬於作業系統,父子程序共享用於管道的檔案描述符,所以兩個程序通過作業系統提供的記憶體空間...

程序間通訊(1) 管道

linux下一切皆檔案,我們可以建立乙個管道檔案進行通訊,實際上是呼叫pipe函式在核心中開闢一塊緩衝區 稱為管道 用於通訊,管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程...

匿名管道(程序間通訊1)

前提 原來也寫過匿名管道的 但是總覺得沒有了解過底層,只是知道 管道是乙個檔案它存在與記憶體上,一般父子程序之間使用但是並沒有研究過底層。所以這次參考linux核心情景分析這本書進行整理。因為對linux虛擬檔案系統的了解因此這次對於匿名管道也有多幫助畢竟他也是個檔案哈哈哈哈哈開始吧 它的系統呼叫是...