Linux 父子程序在沒有同步時出現的問題

2021-05-28 05:24:07 字數 713 閱讀 4822

今天想熟悉下匿名管道,於是在linux上寫了乙個簡單的程式,其中父程序與子程序之間通過匿名管道進行通訊,父程序使用fork建立乙個子程序,使用管道的寫端,並關閉管道的讀端;子程序使用管道的讀端,關閉管道的寫端。

如果沒有父子程序的同步,則父程序與子程序的執行沒有先後順序,然而,管道必須先有寫,然後才能讀。如果子程序先執行,父程序還沒有對管道進行寫操作,則子程序讀管道則會出現錯誤,導致通訊失敗~~如果父程序先執行,並進行了寫操作,則子程序執行時,可以讀管道~~

在父程序先執行,子程序後執行這種情況下,在shell中執行可執行檔案時,父程序輸出後,shell提示符出現了,然後才是子程序的輸出~~為什麼這裡shell提示符會出現呢?

可以這樣理解:shell執行每乙個可執行檔案,相當於執行乙個作業,作業可能是乙個程序也可能是多個程序(多個程序構成程序組),乙個作業可以有乙個前台程序組和任意數量個後台程序組,然而,作業中的程序只包括由shell產生的程序,不包括程序fork後產生的子程序,可以參考博文《linux 程序組,作業,會話的理解》,當作業執行完畢,前台程序組可能沒有執行完畢,因為前台程序產生的子程序可能還存在,但它不屬於作業,前台程序組會轉為後台,shell提示符會變前台,所以會看到父程序輸出後(子程序還沒有執行完畢),shell提示符會出現。子程序轉為後台後,但它還擁有控制終端(只有守護程序沒有控制終端,可以參考博文《linux 守護程序》),所以也會輸出到終端,從而出現上面提到的現象~

通過同步父子程序,可以避免上述現象的出現~

訊號實現父子程序間同步

apue第十章用訊號實現了父子程序間的同步,關鍵點是sigsuspend函式,這裡仔細分析一下實現機制.include include ourhdr.h 資料型別sig atomic t由ansi c定義,在寫時不會被中斷。它意味著這種變數在具有虛存的系統上不會跨越頁邊界,可以用一條機器指令對其訪問...

APUE 通過管道同步父子程序

include ourhdir.h include pid t fd1 2 父程序讀,子程序寫 fd2 2 父程序寫,子程序讀 static int fd1 2 fd2 2 tell wait函式是在未建立子程序的時候呼叫的 子程序建立之後,父子程序都有fd1 fd2 void tell wait ...

訊號實現父子程序間的同步

include include 資料型別sig atomic t由ansi c定義,在寫時不會被中斷。它意味著這種變數在具有虛存的系統上不會跨越頁邊界,可以用一條機器指令對其訪問。這種型別的變數總是與ansi型別修飾符volatile一併出現,防止編譯器優化帶來的不確定狀態。static volat...