微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IO进线程:进程间通信

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

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

BSD:  套接字socket

1、无名管道

1)、特点:

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

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

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

#include <unistd.h>

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

参数:

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

返回值:

    成功: 0

    失败: -1, 并设置errno

``

2、有名管道FIFO

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

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

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

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

不支持如lseek() 操作

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

```c

#include <sys/types.h>

#include <sys/stat.h>

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 <signal.h>

    int kill(pid_t pid, int sig);

      参数:

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

        sig: 信号

    返回值:

        成功: 0

        失败: -1, 并设置errno

           

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

    #include <signal.h>

      int raise(int sig);

      参数:

        sig: 信号

    返回值:

        成功: 0

        失败: 非0

           

3、alarm: 闹钟函数

    #include <unistd.h>

      unsigned int alarm(unsigned int seconds);

      参数:

        seconds:

返回值:

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

    #include <signal.h>

    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

原文地址:https://www.jb51.cc/wenti/3279798.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐