Linux教程網
簡介:
一.
#include <unistd.h>
int pipe(int fd[2]);
//!>注意參數是fd[0]是讀的文件描述符,fd[1]是用來寫的文件描述符
一般用於 “父子進程” 之間的通信!因為pipe是沒有標志的,所以只能在一個進程集中運作!
“單向pipe”:
父進程創建好 pipe 後,同時通過 fork() 創建一個子進程,然後父進程就可以關閉自己這端的“讀進程”,因為 父進程就是將數據寫入子進程的,所以無須 “讀”,然後子進程就關閉自己的“寫”,這樣就形成一個 “單向” 的 pipe。
“雙向pie”:( 可以用於CS )
創建兩個pipe就可以了,其實也就是相當於加一個 “單向”pipe
二.
關於 fork函數
對於fork的返回值:對於父進程返回的是子進程的ID號(肯定是大於0的),對於子進程返回的是0
所以可以通過 if( pid = fork() > 0 ) 和 if( pid == 0 )來判斷是父進程還是子進程在執行
三.
其他
對於 pipe而言,創建 ok後,在子進程和父進程中都會有一個此管道(pipe)的讀和寫的接口!操作value是相同的fd[0]和fd[1]
對於 test.c 中的為例:
由於是多進程編程,那麼對於test.c代碼而言,應該是有“子進程”和“父進程”都可以執行的!也就是說在fork後程序就是分成兩部分,主進程和子進程。
我們可以測試:
如果是printf("on ");那麼可以輸出兩次 on,分別是父進程和子進程輸出的,但是if是printf(" on \n");那麼只輸出一次。
原因:printf的機制是:遇到"\n"就會直接輸出,if沒有,那麼只是儲存在緩存中,然後一起輸出。
所以if有"\n",那麼就是父進程先讓其輸出了,那麼在父進程的空間空就沒有保存printf中的緩存數據了!!!所以子進程就沒有繼承到,所以就不會輸出!!!
也就是說:父進程的printf 空間緩存區也被繼承!!!!!!!!!!!!!!!!!!!!!
getpid():獲得本進程的ID
getppid():獲得父進程的ID
四.參考代碼:
//!>
//!> 單向 pipe實例
//!>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
int g_num =0; //!> 全局變量:用來測試父進程和子進程的獨立空間
//!> 我們可以知道全局變量在子進程和父進程中是有自己的獨立空間的!
int main()
{
int n,fd[2]; //!> fd 是描述符
pid_tpid; //!> 保存的是創建的進程的 ID
charline[100]; //!> 相當於是一個緩存
int num = 0; //!> 也是獨立的~~~
printf(" on"); //!> ATTENTION printf(" on\n");
if( pipe( fd) < 0) //!> 此處就是創建pipe,成功則返回0,if失敗則返回-1
{
exit(0);
}
if( ( pid =fork() ) < 0) //!> 創建子進程
{
exit(0);
}