父程序開啟的檔案描述符在子程序仍然保持開啟,檔案描述符的引用計數+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將會返回兩個...