日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

210120 阶段三 fork与阻塞函数

發布時間:2024/4/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 210120 阶段三 fork与阻塞函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、學習的知識點
    • fork函數
      • 變量的變化
      • 文件描述符的變化
    • 1.1僵尸狀態
    • 1.2孤兒
    • 1.3如何避免僵尸進程
      • 1.3.1 wait
      • 1.3.2 waitpid
    • 2 execlp
    • 守護進程
  • 二、上課沒有聽懂或者沒有理解的地方
  • 三、當天學習的收獲

一、學習的知識點

fork函數

fork函數產生兩個進程,一個是主進程,也就是父進程,另一個是子進程。有兩個返回值,一個返回值大于0,表示父進程,值為子進程的pid。一個返回值等于0,表示子進程。

變量的變化

fork以后,子進程對父進程 RW段(已初始化) BSS段(未初始化)的數據遵循寫時拷貝,有改動時才執行拷貝,而RO段的數據是共用的

文件描述符的變化

fork前open的文件,fork后的子進程后父進程都有相同的文件描述符,但fork后open的文件只有執行open的進程才有對應的文件描述符。我的理解是文件描述符可以繼承但不是共享的。

1.1僵尸狀態

一個子進程結束運行時,父進程還存在

  • 子進程進入僵尸狀態,因為進程結束的返回碼還需要給父進程 exit(0)
  • 子進程不再活躍(不執行邏輯),但是資源無法釋放(CPU/內存/數據)
  • 以上總結說明 程序操作的時候不希望出現 僵尸狀態的情況。
  • 1.2孤兒

    父進程先于子進程結束

  • 父進程沒了PID消失,父進程的所有子代進程都屬于孤兒進程
  • 父進程吧子進程托孤給系統管理
  • 以上總結說明 程序操作的時候不希望出現。
  • 1.3如何避免僵尸進程

    1.3.1 wait

    pid_t wait(int *status);
    wait函數用于使父進程阻塞,只能讓父進程等待子進程,不能使子進程等待父進程。
    wait的返回值,如果等待成功 返回等待的pid號,出錯則返回-1。
    status參數 用來保存被收集進程退出時的一些狀態,它是一個指向int類型的指針。但如果我們對這個子進程是如何死掉的毫不在意,只想把這個僵尸進程消滅掉,(事實上絕大多數情況下,我們都會這樣想),我們就可以設定這個參數為NULL,就象下面這樣:pid = wait(NULL);
    wait函數特點

  • 如果有多個子進程在運行,那么wait函數只會等待先結束的子進程
  • 1.3.2 waitpid

    pid_t waitpid(pid_t pid, int * status, int options) ; 等待某個指定的子進程。等待進程ID為pid的進程

    • pid == -1 等待任一子進程。于是在這一功能方面waitpid與wait等效。
    • pid > 0 等待其進程I D與p i d相等的子進程。
    • pid == 0 等待其組I D等于調用進程的組I D的任一子進程。
    • pid < -1 等待其組I D等于p i d的絕對值的任一子進程。

    2 execlp

    在子進程里調用另外一個程序
    execl系列函數的作用就是可以在你創建的子進程中調用其他人寫好的可執行程序
    execlp是替換進程映像 相關函數只要調用,后面的代碼都不會執行 +p會導入系統的環境變量
    execlp(“ls”, “ls -l”, NULL);
    execlp(“ps”,“ps”,"-ax",0);

    守護進程

    概念:程序一旦啟動就會轉入后臺,不會因為關閉終端而結束進程

    • 最重要的特性是后臺運行
    • 如果你要脫離終端運行,首先要創建一個新的會話 創建會話函數 setsid();
    • 默認情況下 父進程不能創建會話
    • 創建的守護進程不要使用 printf、cout等輸出函數。因為脫離終端 而字符輸出依賴于終端 所以輸出了也看不見
    • 在Linux中 輸入輸出都有設備 他有專門的文件描述符 0 1 2錯誤輸出
    • 所以創建完守護進程后 也要分別關閉 close(0) close(1) close(2)
    • 在默認程序后
    • 一個終端可以運行很多進程 多個進程會組成會話 session 會話有權利創建終端
    • 一個進程可以產生子進程,產生多個子進程 為進程組 默認情況下父進程就是進程組組長
    void create_deamons() {pid_t pid = fork();if (pid == 0){setsid();//因為父進程默認是進程組組長,所以不允許調用setsid函數來創建會話//子進程成功創建了會話,默認稱為會話的領導者,這個會話領導者有一個權力:可以創建一個新的終端pid = fork();if (pid == 0){//while循環要替換成守護進程的功能代碼段while (1){sleep(1);}//再創建一個子進程的時候,這個子進程不是會話組組長他就沒有權力創建新的進程,真正脫離了終端運行//這里面的代碼才是真正的守護進程代碼}_exit(0);}else if (pid > 0){_exit(0); //要寫在父進程中 否則子進程會被殺死} }forint i =0;i<=2;i+{ close(i); } //關閉鍵盤 顯示器 錯誤輸出(并不是一定 一般規則如此)

    二、上課沒有聽懂或者沒有理解的地方

    三、當天學習的收獲

    避免僵尸進程

    總結

    以上是生活随笔為你收集整理的210120 阶段三 fork与阻塞函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。