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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习笔记-对父子进程直接通信基础与实例

發布時間:2025/3/15 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux学习笔记-对父子进程直接通信基础与实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

原理

栗子


原理

實現進程通信的目的:

數據傳輸!
共享數據!
通知事件!
資源共享!
進程控制!

早期linux進程間信號(IPC)有3個部分:

  • UNIX進行通信方式:管道、FIFO、信號;
  • System V進程通信: System V消息隊列、System V信號量、 System V共享內存;
  • POSIX進程間通信:posix消息隊列、posix信號量、posix共享內存;
  • 目前Linux進程通信方式:

  • 管道(pipe)和命名管道(FIFO);
  • 信號(signal);
  • 消息隊列;
  • 共享內存;
  • 信號量;
  • 套接字(socket);

  • 管道通信:

  • 本地計算機的兩個進程之間的通信而設計的,管道建立后,獲取兩個文件的描述符:一個用于寫,一個用于讀;
  • 通過pipe系統調用;
  • 管道是單工的,數據只向一個方向流動,雙向流動要建立兩個管道;
  • 數據的讀出和寫入:一個進程向管道中寫的內容被管道另一端讀出。寫入的內容每次都添加到管道的緩存區的末尾,并且每次都是從緩存區的頭部讀取數據。
  • 【注意:管道實際上是創建到計算機內核當中的緩存】

    管道分類:
    匿名管道:

  • 在關系進程中進行(父進程和子進程、兄弟進程直接);
  • 由pipe系統調用,管道由父進程建立;
  • 管道位于內核空間,其實是一塊緩存;
  • 命名管道(FIFO):

  • 兩個進程之間沒有任何關系,本質上是內核中的一塊緩存,另外在文件系統中以一個特殊的設備文件(管道文件)存在。
  • 通過系統調用mkfifo創建;
  • 【注意可以通過操作這個管道文件就可以了,他會自動同步到緩存中】

    注意:
    fork子進程后,會復制父進程的數據(代碼段,數據段,堆棧等),所以fd(文件描述符)也會被復制
    fork函數將運行著的程序分成2個(幾乎)完全一樣的進程,每個進程都啟動一個從代碼的同一位置開始執行的線程。這兩個進程中的線程繼續執行,就像是兩個用戶同時啟動了該應用程序的兩個副本。

    ?

    栗子

    下面是源碼,要注意:

  • fd[0]:為pipe的讀端口;fd[1]:為pipe的寫端口;
  • 要注意,用完,或不用端口就把他關掉;
  • 父進程要回收下子進程、wait()是等待進程結束;
  • 源碼如下:

    #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h>int main(void){int fd[2];if(pipe(fd) < 0){perror("pipe error!");exit(1);}pid_t pid; if((pid = fork()) < 0){perror("fork error");exit(1);}else if(pid >0 ){ // parent processclose(fd[0]);int start = 1, end = 100;//往管道中寫數據if(write(fd[1], &start, sizeof(int)) != sizeof(int)){perror("write error");exit(1); }if(write(fd[1], &end, sizeof(int)) != sizeof(int)){perror("write error");exit(1);}close(fd[1]);wait(0);}else{ //child processclose(fd[1]);int start, end;if(read(fd[0], &start, sizeof(int)) < 0){perror("read error");exit(1);}if(read(fd[0], &end, sizeof(int)) < 0){perror("read error");exit(1);}close(fd[0]);printf("child process read start: %d , end: %d \n", start, end);}exit(0); }

    程序運行截圖如下:

    總結

    以上是生活随笔為你收集整理的Linux学习笔记-对父子进程直接通信基础与实例的全部內容,希望文章能夠幫你解決所遇到的問題。

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