• IO进线程:进程间通信


    早期进程间通信: 无名管道、有名管道 、信号

    system V IPC: 共享内存、消息队列、信号灯

    BSD:  套接字socket

    1、无名管道

    1)、特点:

    只能用于具有亲缘关系的进程之间的通信

    半双工的通信模式,具有固定的读端和写端

    管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。

    #include

    int pipe(int pipefd[2]);  //创建管道,得到管道的读端fd[0]和写端fd[1]

    参数:

        pipefd ---- 存放读写文件描述符的数组首地址

    返回值:

        成功: 0

        失败: -1, 并设置errno

    ``

    2、有名管道FIFO

    无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围

    有名管道可以使互不相关的两个进程互相通信。有名管道可以通过路径名来指出,并且在文件系统中可见

    进程通过文件IO来操作有名管道

    有名管道遵循先进先出规则

    不支持如lseek() 操作

    有名管道的内容保存在内存中

    ```c

    #include

    #include

    int mkfifo(const char *pathname, mode_t mode);

    参数:

        pathname --- 路径 + 名字

        mode     --- 权限,一般0664

    返回值:

        成功: 0

        失败: -1, 并设置errno

    使用: open close  read  write

    ==总结==

    * 管道只有在读写端存在时才有意义

    * 写端存在时,当管道中有数据时,读端可以读到数据,没有数据时,读端阻塞。但是写端关闭时,读端会把管道中的数据都读走后返回0

    * 当读端存在时但不读取数据,写端把管道缓冲区写满后会阻塞,直到读端读走数据就可以继续写入

    * 当读端关闭时,写端再向管道中写入,会出现管道破裂的信号(SIGPIPE)导致进程结束

    mkfifo  +文件名        (管道的创建)

    3、信号

    用户进程对信号的响应方式:

    * 忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。

    * 捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数。

    * 执行缺省操作:Linux对每种信号都规定了默认操作

    1、kill: 向进程发射信号

        #include

        int kill(pid_t pid, int sig);

          参数:

            pid: 进程号, 0:同一个进程组, -1:信号发给所有的进程表中的进程(除了进程号最大的进程外)

            sig: 信号

        返回值:

            成功: 0

            失败: -1, 并设置errno

               

    2、raise: 向自己进程发射信号

        #include

          int raise(int sig);

          参数:

            sig: 信号

        返回值:

            成功: 0

            失败: 非0

               

    3、alarm: 闹钟函数

        #include

          unsigned int alarm(unsigned int seconds);

          参数:

            seconds:

    返回值:

    4、signal:注册信号的处理方式

        #include

        typedef void (*sighandler_t)(int);

        sighandler_t signal(int signum, sighandler_t handler);

        参数:

            signum:  信号

            handler:

                    SIG_IGN: 忽略信号

                SIG_DFL: 缺省信号

                函数的入口地址: 捕获信号

    4、共享内存

    key: IPC_PRIVATE, ftok

    创建或打开共享内存:shmget

    把共享内存映射到用户空间: shmat

    解除映射: shmdt

    销毁共享内存:shmctl

    5、消息队列

    消息队列可以使用类型来发送和接收消息

    key: IPC_PRIVATE, ftok

    创建或打开消息队列:msgget

    添加消息(发送消息): msgsnd

    读取消息(接收消息): msgrcv

    控制消息(删除消息队列): msgctl

    6、信号灯

    二值信号灯:值为0或1。与互斥锁类似,资源可用时值为1,不可用时值为0。

    计数信号灯:值在0到n之间。用来统计资源,其值代表可用资源数

    等待操作是等待信号灯的值变为大于0,然后将其减1;而释放操作则相反,用来唤醒等待资源的进程或者线程

    System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯

    System V 信号灯由内核维护

    主要函数semget,semop,semctl

  • 相关阅读:
    Vue3+ElementPlus纯前端分页(手撕分页),无需修改后端
    物联网开发笔记(53)- 使用Micropython开发ESP32开发板之蓝牙BLE通信
    亚马逊主图视频可以上传几个?有什么要求?
    养发神器:重复代码一键生成,从此远离加班,告别秃头!
    前端 JS 安全对抗原理与实践
    C和指针 第10章 结构和联合 10.11 编程练习
    智能转码技巧大揭秘,轻松实现视频转码!
    安装Docker
    PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(函数题)
    Human3.6M 数据集介绍及下载
  • 原文地址:https://blog.csdn.net/qq_63626307/article/details/126515450