zoukankan      html  css  js  c++  java
  • Linux下进程间通信的常用方法

    0. 文件

    利于进程间共享文件描述符的特性实现。开销最大,已经废弃。 

    1. 无名管道pipe

    原理:通过内核缓存区和循环队列实现;

    特性:1.两个文件描述符,数据从一端写入,另一端读出,单向通信;

    2.读数据时:如果管道有数据,直接读取并返回读取的字节数;

           如果管道没数据,如果所有的写端都关闭了,读取返回0;如果还有写端打开,阻塞等待写端写数据;

    3.写数据时:如果读端全部关闭,就会收到一个SIGPIPE信号而进程异常终止;

     如果有读端打开,如果管道没满,写数据并返回的字节数;如果管道满了,阻塞等待读端读数据; 

    缺点:1.单向通信(半双工通信方式),一个进程只能读或者写,不能同时读和写

    2.数据不能反复读,一旦读走了,就不在该内核缓存区了

    3.只能用于有血缘关系的进程间通信 

    函数:int pipe(int pipefd[2]); //pipefd是长度为2的int数组,传出参数;pipefd[0]是读端文件描述符,pipefd[1]是写端文件描述符

    举例说明:

    int main(int argc, char *argv[]) { 

      int pipefd[2]; pid_t cpid; char buf;

    if (pipe(pipefd) == -1) { perror("pipe");exit(EXIT_FAILURE);}//创建管道失败,直接退出

    cpid = fork(); 

    if (cpid == -1) { perror("fork");exit(EXIT_FAILURE);}//创建子进程失败,直接退出

    if (cpid == 0) { //子进程

    close(pipefd[1]);//这里让子进程读取数据,关闭写端;pipefd[0]读端,pipefd[1]写端

    while (read(pipefd[0], &buf, 1) > 0) //读数据到buf;长度大于0,说明读取到数据;0表示所有写端关闭了

    write(STDOUT_FILENO, &buf, 1); //将数据输出到标准输出

    close(pipefd[0]); //关闭读端

    _exit(EXIT_SUCCESS); 

    } else { //父进程

    close(pipefd[0]); //让父进程写数据,关闭读端

    write(pipefd[1], argv[1], strlen(argv[1])); //将参数argv[1]写入管道;所以命令行运行需要带参数,如./test "hello world"

    close(pipefd[1]); //关闭写端

    wait(NULL); //等待子进程退出
      exit(EXIT_SUCCESS);

    2. 有名管道fifo 

    原理:fifo是Linux文件系统里的一种基础文件类型 

    特性:必须使用同一个fifo文件才能通信;可以同时多端读、多端写;和pipe最大的区别是 可用于无血缘关系的进程间通信

    函数:int mkfifo(const char *pathname, mode_t mode); //pathname文件路径,mode八进制权限

    该函数创建一个fifo类型的文件,也可以使用mkfifo手动创建;

    举例说明:1.先创建好一个fifo文件,可代码创建也可以命令行创建;2.向这个fifo文件读写数据,和普通文件读写类似

      fd = open("test", O_RDONLY);read(fd, buf, sizeof(buf));//test是fifo文件,一个进程只读方式打开该文件读数据

      fd = open("test", O_WRONLY);write(fd, buf, strlen(buf));//test是同一个fifo文件,另一个进程只写方式打开写入数据

    3.共享存储映射区mmap、munmap

    //todo

    4. 信号 (开销最小)

    //todo

    5.套接字 (最复杂,但最稳定) 

     //todo

  • 相关阅读:
    Spring 中出现Element : property Bean definitions can have zero or more properties. Property elements correspond to JavaBean setter methods exposed by the bean classes. Spring supports primitives, refer
    java定时器schedule和scheduleAtFixedRate区别
    hql语句中的select字句和from 字句
    使用maven搭建hibernate的pom文件配置
    Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from http://repo.maven.apache.org/ maven2 was cached in the local repository, resolution will not be reattempted until the update interv
    对于文件File类型中的目录分隔符
    hibernate的事务管理和session对象的详解
    解决mac 中的myeclipse控制台中文乱码问题
    ibatis selectKey用法问题
    Java中getResourceAsStream的用法
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/6796598.html
Copyright © 2011-2022 走看看