进程间通信就是在不同进程之间传播或交换信息,进程的用户空间是相互独立的,一般而言是不可以互相访问(除共享内存区外),系统空间却是“公众场所”,通过通信方法:管道(pipe)(有名管道FIFO)、消息队列、信号量(semaphore)、共享内存(shared memory)、套接字(socket)等实现功能。

进程间通信的主要目的在于:数据传输(管道pipe),共享数据,通知事件,资源共享,进程控制

管道通信:管道是单向的,先进先出,尾部写入数据,头部读出数据

无名管道用于父子进程间的通信,有名管道用于同一系统下的兄弟进程间的通信。

无名管道创建API:int pipe(int filedis[2])(当一个管道建立,会产生两个文件描述符,filedis[0]读管道,filedis[1]写管道)

有名管道创建API:int mkfifo(const char *pathname,mode_t mode)(pathname:FIFO文件名  mode:属性)

信号通信:最为古老的进程间通信机制

常见信号:SIGHUP(来自终端的结束信号) 、SIGINT(来自键盘的中断信号) 、SIGKILL(结束接收信号) 、SIGTERM(kill命令发出的信号) 、SIGCHLD(标识子进程停止或结束) 、SIGSTOP(停止执行信号)【SIGKILL、SIGSTOP绝不可以被忽略】

信号发送kill、raise、alarm、pause的API:

int kill(pid_t pid,int signo)
//kill函数既可向自身发送信号,也可向其他进程发送信号
int raise(int signo)
//raise函数是向自身发送信号
unsigned int alarm(unsigned int seconds)
/*alarm函数是设置一个闹钟时间
seconds:经过second秒后会产生信号SIGALRM*/
int pause(void)
//该函数是使调用过程挂起直至捕捉到一个信号
信号的处理:
signal的API:void(*signal(int signum,void(*handler)(int)))(int);
共享内存
被多个进程共享的一部分物理内存,共享进程是进程间共享数据的一种最快的方法

创建API:int shmget(key_t key,int size,int shmflg) 成功返回共享内存标识符,失败返回-1

映射API:char *shmat(int shmid,char *shmaddr,int flag) 成功返回共享内存映射到进程中的地址,失败返回-1

消息:

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
//消息格式
struct msgbuf
{long mtype;//消息类型char mtext[1];//消息数据的首地址
};int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int msgflg)
//功能:向消息队列中发送一条消息int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long msgtyp,int msgflg)
//功能:接收消息,从msqid代表的消息队列中读取一个msgtyp类型的消息;成功则返回读出消息的字节数int msgget(key_t key,int msgflg)
//key为键值,由ftok获得;msgflg为标志位
//返回值为与键值key相对应的消息队列描述字key_t ftok(char *pathname,char proj);
//将文件名转化为键值
key: IPC_CREAT、IPC_EXCL、IPC_NOWAIT

总结:

进程间的通信中关于管道通信时,Linux将不保证写入的原子性(即不保证完整的完成一个进程),只要管道缓冲区有空闲区域,写进程就会试图向管道中写入数据,若读进程不读走缓冲区中的数据,写操作将一直被阻塞。创建无名管道时,父子进程fork()的使用必须在pipe()调用之后。注意:alarm函数使用时,每个进程至多有一个闹钟时间,若以前登记过,且未超时,此时登记新的值,值>0则取代之前的值,值=0则为取消以前的闹钟。

C语言进程——进程间的通信方式相关推荐

  1. 进程间的通信方式(二):管道Pipe和命令管道FIFO

    1.概述 管道是最初的Unix IPC通信,可追溯到1973年的Unix第三版.尽管对于许多操作来说很有用,但它们的根本局限于没有名字,只能由亲缘关系的进程使用.这一点随着FIFO的加入System  ...

  2. step4 . day7 进程间的通信方式

    进程间的通信方式: 无名管道(pipe) 有名管道 (fifo) 信号(signal) system v5的进程间通信方式 共享内存(share memory) 消息队列(message queue) ...

  3. java不同进程的相互唤醒_JAVA多线程之线程间的通信方式

    一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...

  4. msgget();msgsnd();msgrcv();msgctl(); 消息队列 Linux进程间的通信方式之消息队列

    Linux进程间的通信方式 ----消息队列. 消息队列和共享内存类似 消息队列它允许一个或多个进程向它写消息,一个或多个进程向它写读消息. 消息队列存在于系统内核中,消息的数量受系统限制. 我们来看 ...

  5. unix进程间的通信方式

    unix进程间的通信方式 (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. (2)命名管道(named pipe):命名管道克服了管道 ...

  6. 1、几种进程间的通信方式

    1.几种进程间的通信方式 # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. # 有名管道 (named ...

  7. linux的进程与线程通信方式,Linux的进程/线程间通信方式总结

    Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程 ...

  8. 共享内存(进程间的通信方式)

    目录 1.共享内存的特点 2.函数接口 3.有关共享内存的系统命令 1.共享内存的特点 (1)共享内存是一种最高效的进程间的通信方式,进程可以直接读写内存,而进程之间不需要通过任何数据的拷贝. (2) ...

  9. 进程间各种通信方式的C++实现

    一.信号Signal 信号是软中断,用于通知接受进程某个事件发生.一个进程可以发送信号给另一个进程,接受进程可以注册信号处理函数来相应信号.信号通常用于接收进程某个进程操作完成或异常事件发生 //发送 ...

  10. Android10.0 四大组件与进程启动间关系

    原文地址:https://skytoby.github.io/2019/Android%E5%9B%9B%E5%A4%A7%E7%BB%84%E4%BB%B6%E4%B8%8E%E8%BF%9B%E7 ...

最新文章

  1. SAP HUM 将HU与检验批号码解除关联关系
  2. Linux(CentOS)网络流量实时监控(iftop)
  3. 12563 - Jin Ge Jin Qu hao
  4. [Swift]LeetCode1043. 分隔数组以得到最大和 | Partition Array for Maximum Sum
  5. Gink掉过的坑(一):将CCTableView导入到lua中
  6. OSEK/VDX网络管理
  7. {errcode:40125,errmsg:invalid appsecret, view more at http:\/\/t.cn\/RAEkdVq, hints: [ req_id:
  8. 嵌入式烧写Linux内核,嵌入式linux 内核和根文件系统烧写方式简介
  9. outlook从服务器中恢复已删除项目,恢复邮箱中的已删除邮件:Exchange 2013 帮助 | Microsoft Docs...
  10. LaTex论文排版 | (16)绘制程序流程图(框图)
  11. 专注年轻一代,基于E-MapReduce梨视频推荐系统
  12. 让我们来谈谈python中的prettyprint和pprint
  13. ESP32/8266 WIFI模块连接Linux云服务器
  14. 本科、硕士研究生毕业论文字体、段落格式参考
  15. 基于HTML5的在线地图 - 加载TopoJSON数据
  16. Couple可爱情书字体
  17. 【知乎Live】狼叔:如何正确的学习Node.js
  18. AB COMPACTLOGIX调试步骤
  19. Android学习笔记——第一个应用
  20. 在电脑上解压计算机试题打不开,zip文件怎么打不开_电脑上zip文件打不开解决方法-win7之家...

热门文章

  1. C语言 半加器与全加器 详解
  2. RTTI (Runtime Type Identification)
  3. iptables匹配iprange
  4. IDEA生成jar工具包
  5. 矩阵快速幂(51nod)
  6. js 跳转到指定页面
  7. Tomcat启动报错org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to sta
  8. 计算机c盘要满了电脑会卡吗,电脑C盘快满了,赶快来清理电脑C盘垃圾文件,不然系统会越来越卡...
  9. 模拟人类大脑每秒计算数量级及参数容量的估计
  10. 微信小程序的左右布局