C語言進程和進程之間通訊的方式_管道的使用


進程和進程之間的內存是相對獨立的

進程和進程通訊原理

進程和進程之間通訊的方式

  • 管道(使用最簡單)
    • 只能用在有血緣關系的進程之中
  • 信號(開銷最小)
  • 共享映射區(無血緣關系)
  • 本地套接字(最穩定,實現復雜度最高)

管道

管道必須用在有父子關系的進程中

管道是一種最基本的IPC機制,作用與有血緣關系的進程之間,調用pipe系統函數,即可以創建一個管道,

  • 其本質是一個偽文件(實為內核緩存區)
  • 由兩個文件描述符引用,一個表示讀端,一個表示寫端
  • 規定數據從管道的寫入端流入管道,從讀取端讀出

局限性:

  • 自己寫,不能自己讀
  • 數據不可以反復讀
  • 單工通信
  • 血緣關系進程間可用

pipe函數,創建並打開管道

int pipe (int fd[2]);

// 參數
// fd[0] : 讀端
// fd[1] : 寫端

例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

void sys_err(const char *str)
{
  perror(str);
  exit(1);
}

int main(int agrc, char *argv[])
{
  int ret;
  int fd[2];
  pid_t pid;
  
  char buf[1024];
  
  ret = pipe(fd);
  if (ret == -1){
    sys_err("pipe error");
  }
  
  pid = fork();
  if (pid>0)
  {
    close(fd[0]);  // 關閉讀端
    write(fd[1], "hello pipe", strlen("hello pipe"));
    close(fd[1]);
    // 父進程
  }	else if(pid==0){
    // 子進程
    close(fd[1]);
    ret = read(fd[0], buf, size(buf));
    write(STDOUT_FILENO, buf, ret);
    close(fd[0]);
  }
  
  
  
  return 0;
}


管道的讀寫行為

讀管道

  1. 管道有數據,read返回實際讀到的字節數
  2. 管道無數據,
    1. 無寫端,read返回0
    2. 有些端,read堵塞等待

寫管道

  1. 無讀端,異常終止
  2. 有讀端,
    1. 管道已滿,阻塞等待
    2. 管道未滿,返回寫出的字節個數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM