zoukankan      html  css  js  c++  java
  • Linux高级编程--07.进程间通信

    每个进程各自有不同的用户地址空间,进程之间要交换数据必须通过在内核中开辟缓冲区,从而实现数据共享。

    管道

    管道是一种最基本的IPC机制,由pipe函数创建:

    int pipe(int filedes[2]);
    

    调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。所以管道在用户程序看起来就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]);向这个文件读写数据其实是在读写内核缓冲区。

    一个基本示例如下:

    #include <stdlib.h>
    #include <unistd.h>
    #define MAXLINE 80
    
    int main(void)
    {
        int n;
        int fd[2];
        pid_t pid;
        char line[MAXLINE];
    
        if (pipe(fd) < 0) {
            perror("pipe");
            exit(1);
        }
        if ((pid = fork()) < 0) {
            perror("fork");
            exit(1);
        }
        if (pid > 0) { /* parent */
            close(fd[0]);
            write(fd[1], "hello world
    ", 12);
            wait(NULL);
        } else { /* child */
            close(fd[1]);
            n = read(fd[0], line, MAXLINE);
            write(STDOUT_FILENO, line, n);
        }
        return 0;
    }
    

    使用管道也有一些限制:

    • 管道的读写端通过打开的文件描述符来传递,因此要通信的两个进程必须从它们的公共祖先那里继承管道文件描述符。
    • 两个进程通过一个管道只能实现单向通信

    其它IPC机制

    除了管道外,还有如下几种常用的IPC机制:

    文件:    几个进程可以在文件系统中读写某个共享文件,也可以通过给文件加锁来实现进程间同步
    信号:    进程间使用SIGUSR1和SIGUSR2实现用户自定义功能
    Socket:    它还可以跨主机,并且标准统一,不同的操作系统都支持,是使用的最广泛的IPC机制
    内存映射:几个进程映射同一个内存区
    




  • 相关阅读:
    Mybatis 框架下 SQL 注入攻击的方式
    Vue 环境准备
    HTTP.sys漏洞的检测和修复(附补丁包下载)
    BPM工作流中的一些业务场景
    关系型数据库
    .NET中使用Redis总结——2.项目实战
    Java 开源项目整合
    在IIS 搭建FTP站点
    悲观锁和乐观锁详解
    C# 通过一个控制台打开另一个控制台
  • 原文地址:https://www.cnblogs.com/linzhenjie/p/5485649.html
Copyright © 2011-2022 走看看