linux管道pipe父子程序通訊的示例

2021-10-03 14:46:45 字數 1466 閱讀 7378

父程序開啟的檔案描述符在子程序仍然保持開啟,檔案描述符的引用計數+1,不僅如此,父程序使用者根目錄、當前目錄等變數的引用計數也會+1.

即使呼叫exec函式,檔案描述符也不會關閉,除非設定了sock_cloexec屬性。

#include #include #include #include int main()

printf("建立管道成功\n");

pid = fork();

if( pid < 0)else if(pid == 0)else

scanf("%s",msg);

close(fd[0]);//關閉讀

write(fd[1],msg,strlen(msg)+1);//開始寫

printf("子程序寫入完成\n\n");

if ( strcmp(msg,"eof") == 0)

}//while

printf("子程序結束\n");

_exit(0);

}else

if(childflag==2) else

close(fd[1]);//關閉寫

read(fd[0],msg,bufsiz);//開始讀

if(parentflag==2)

printf("父程序讀取完成\n\n");

}}//while

wait(null);//等待子程序執行完

printf("父程序結束\n");

}printf("程式結束\n");

return 0;

}//執行結果如下

in$ gcc homework-5.8.c 

in$ ./a.out

程式開始

建立管道成功

父程序開始

父程序阻塞,進入子程序

子程序開始

1子程序寫入:

ewe子程序寫入完成

父程序解除阻塞

父程序開始讀取

父程序讀取:ewe

子程序阻塞,進入父程序

父程序讀取完成

父程序阻塞,進入子程序

2子程序寫入:

345子程序寫入完成

父程序解除阻塞

父程序開始讀取

父程序讀取:345

父程序讀取完成

父程序阻塞,進入子程序

2子程序寫入:

ert子程序寫入完成

子程序阻塞,進入父程序

父程序解除阻塞

父程序開始讀取

父程序讀取:ert

父程序讀取完成

父程序阻塞,進入子程序

2子程序寫入:

eof子程序寫入完成

子程序結束通訊

父程序解除阻塞

子程序結束

父程序開始讀取

父程序讀取:eof

父程序結束通訊

父程序結束

程式結束

Linux程序間通訊之管道 pipe

管道是unix系統ipc的最古老的形式,並且所有unix系統都提供此種通訊機制。但是管道存在如下特點 管道是半雙工的。管道只能用在具有公共祖先的程序之間。管道的建立 管道是通過呼叫pipe函式建立的 include int pipe int filedes 2 引數filedes 2 是兩個檔案描述...

Linux程序間通訊 管道 pipe

程序是乙個獨立的資源管理單元,不同程序間的資源是獨立的,不能在乙個程序中訪問另乙個程序的使用者空間和記憶體空間。但是,程序不是孤立的,不同程序之間需要資訊的互動和狀態的傳遞,因此需要程序間資料的傳遞 同步和非同步的機制。當然,這些機制不能由哪乙個程序進行直接管理,只能由作業系統來完成其管理和維護,l...

linux管道通訊(pipe)

linux pipe適合於父子程序之間進行通訊。如下面 所示 include include include int main create sub process pid fork if 1 pid else if 0 pid else return 0 當呼叫fork函式後,fork將會返回兩個...