进程间通信的基本概念

简单介绍了进程间通信的基本概念

进程间通信的方法

pipe, fifo, message queue, semaphores, shared memory

pipe

  • pipe的限制
    pipe是最常用的进程间通信方法,但有两条限制:
  1. 一个pipe只支持单向通信,如果需要双向通信,需要创建2个pipe,当然现在有些Unix系
    统是支持双向通信
  2. pipe只能用于两个有共同祖先的进程之间,一般是父进程和子进程之间
  • pipe的创建函数
#include<unistd.h>

int pipe(int fd[2]); 

创建成功后,fd数组就包含了2个文件描述符,文件描述符的使用方法和打开普通文件后
得到的文件描述符一样。
区别是fd[0]只能用于读取,fd[1]只能用于写入,fd[1]写入的字符串会被fd[0]
读取,数据流过程如下:

fd[1]写入 ---> pipe(kernel) ---> fd[0]读取
  • 例子
    下面的简单例子展示了父进程和子进程之间的通信,父进程向子进程通过pipe传递了字符串
    hello world
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
    int n;
    int fd[2];
    pid_t pid;
    char line[100];
    
    if (pipe(fd) < 0){
        printf("fail to pipe.\n");
        return 1;
    }
    if ((pid = fork()) < 0){
        printf("fail to fork.\n");
        return 1;
    }

    if (pid > 0){   /* parent*/
        close(fd[0]);
        write(fd[1], "hello world\n", 12);
    } else {    /* child */
        close(fd[1]);
        n = read(fd[0], line, 100);
        printf("%s", line);
    }
}

其他通信方法

  1. fifo突破了pipe的2点限制,可以双向的在不相关的线程间通信
  2. messagequeue是内核保存的一个消息队列,一个进程可以往里添加消息,另一个线程可
    以读取里面的消息
  3. semaphore不是线程之间传递数据的机制,而是一个计数器,可以对多个进程共享的资源
    提供保护机制,可以用来实现锁的功能
  4. shared memory,多个进程之间共享内存,是最快速的进程间通信方式
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。