Linux 进程间通信

进程间通信

进程间通信机制:

  • unix继承:管道、信号

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

  • 套接字

传统的UNIX进程间通信方式包括无名管道、有名管道以及信号。

System V进程间通信(IPC)包括System V消息队列、System V信号量以及System V共享内存。

现在在Linux中使用较多的进程间通信方式主要有以下几种:

1)无名管道 及 有名管道

2)信号

3)共享内存

4)消息队列

5)信号灯集

6)套接字。这是一种使用更广泛的进程间通信机制,它可用于网络中不同主机之间的进程间通信,应用非常广泛。本篇文章主要介绍前五种进程通信方式,套接字将在之后的网络编程中讲到。

1、管道

管道分为 无名管道 和 有名管道,区别在于创建的管道能否在文件系统中是否可见。

1)无名管道
特点:
  1. 创建之后在文件系统中不可见

  2. 半双工的方式进行通信

  3. 拥有固定的读端写端

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

①无名管道的创建 pipe()
#include <unistd.h>
int pipe(int pipefd[2];
参数:
	pipefd:		存放无名管道读端 和 写端的数组首地址
 		pipefd[0]:	读端
 		pipefd[1]:	写端
      
返回值:
	成功返回 0, 失败返回 -1;

练习: 在一个进程中创建一个子进程,子进程从键盘获取数据,父进程打印输出

② 无名管道的读写特性

读特性:

写端存在:

  • 管道有数据: 返回读到的字节数

  • 管道无数据: 阻塞

写端不存在:

  • 管道有数据: 返回读到的字节数

  • 管道无数据: 返回 0

写特性:

读端存在:

  • 管道有空间: 返回写入的字节数

  • 管道无空间: 阻塞,直到有空间为止

读端不存在:

  • 无论管道有无空间,管道破裂

练习: ① 计算无名管道空间大小

​ ②验证管道破裂

2)有名管道 - 创建的管道在文件系统中 可见
  • 有名管道创建成功后会在文件系统中以管道文件的形式存在
  • 有名管道可以用于任意两个进程间通信,没有固定的读端和写端

① 有名管道的创建 mkfifo()

#include <sys/types.h>
#include <sys/stat.h>

int mkfifo(const char *pathname, mode_t mode);
参数:
	pathname:	创建管道文件的文件名
    mode:		创建管道文件的权限

返回值:
	成功返回 0, 失败返回 -1;

练习: 创建一个有名管道,一个进程向管道中输入数据,另一个进程输出数据

2、信号

信号:是中断在软件层次上的一种模拟

信号的处理方式:

  • 默认处理

  • 忽略

  • 捕获信号

1)常用信号
2)信号相关指令
kill -l					查看当前系统中的所有信号
kill -信号编号 -进程号		向指定进程发送对应编号的信号
  eg.
	kill -9 1123		向进程  1123发送信号9
    kill -9 -1123		向进程组 1123发送信号9
    kill -9 -1			向除了init进程以外的其他所有进程发送信号9
3)信号相关接口函数

kill() / raise()

#include <sys/types.h>
#include <signal.h>

int kill(pid_t pid, int sig);
参数:
	pid:	指定进程号
	sig:	指定信号
返回值:
	成功返回 0,失败返回 -1------------------------------
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值