一、信号管理

1、函数signal

signal函数是UNIX系统信号机制最简单的接口

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t  handler );
/*
signum:信号的编号
handler: 函数指针 接到此信号时要调用的程序
SIG_IGN 忽略signum信号
SIG_DFL 恢复信号默认的处理方式 返回值:信号设置之前信号的处理方式
函数指针、SIG_IGN、SIG_DFL
*/

该函数用于设置一个指定信号的处理方式,可以一个自定义的指定类型函数,也可以选择忽略信号或恢复信号默认处理方式

2、函数kill

#include <sys/types.h>
#include <signal.h> int kill(pid_t pid, int sig);
// 功能:向指定的进程发送信号
// pid:与waitpid一样
// sig:信号码
// 0 空信号,不会向进程发送信号,但是会测试是否能向pid发送信号,可以检测一个进程是否存在,返回-1 表示进程不存在,errno变为ESRCH。
// 返回值:-1 说明进程不存在

该函数用于进程之间发送信号,可以在进程间通信使用共享内存时,用于发送读完毕或写完毕信号避免多进程同时访问同一块内存造成错误

二、进程间通信

1、共享内存

  1、由内核维护一块共享的内存区域,其它进程,把自己的虚拟地址映射到这块内存,多个进程之间就可以共享这块内存了。
  2、这种进程间通信的好处是不需要信息复制,它是进程间通信最快的一种方式。
  3、但这种通信方式会面临同步的问题,需要与其它通信方式配合,最合适的就是信号。

进程之间互相约定一个key值,此key值将会作为内核定位同一块内存的依据,使得多个进程之间能够共享一块内存

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h> int shmget(key_t key, size_t size, int shmflg);/*
功能:创建共享内存
size:共享的大小
shmflg:IPC_CREAT:创建
IPC_EXCL :如果存在创建失败
IPC_EXCL | IPC_CREAT
mode_flags 权限
返回值:IPC对象标识符(类似文件描述符)
shmget(key,size,0744|IPC_CREAT);*/ void *shmat(int shmid, const void *shmaddr, int shmflg); /*
功能:加载共享内存(进程的虚拟地址和共享的内存进行映射)
shmid:shmget的返回值
shmaddr:进程提供的虚拟地址,如果为 NULL 操作系统会自动选择一块地址映射
shmflg: SHM_RDONLY: 限制内存的权限为只读
SHM_REMAP: 映射已经存在的共享内存
SHM_RND: 当shmaddr为NULL时自动分配
SHMLBA : shmaddr值不能为空,否则出错
返回值:映射后的虚拟地址
*/
int shmdt(const void *shmaddr);/*
功能:卸载共享内存(进程的虚拟地址与共享内存取消映射关系)*/ int shmctl(int shmid, int cmd, struct shmid_ds *buf);/*
共享:控制/销毁共享内存
cmd:
IPC_STAT:获取共享内存的属性
IPC_SET :设置共享内存的属性
IPC_RMID:删除共享内存
buf:记录共享内存属性的对象*/

共享内存一旦创建,系统上的进程只要拥有它的key值就能够通过函数shmget,shmat访问到该内存。

共享内存操作麻烦,需要配合信号使用,但共享内存更适合于较大的数据通信。

1、消息队列

1、消息队列是一个由系统内核负责存储和管理、并通过IPC对象标识符获取的数据链表。

2、使用消息队列需要创建一个定义了消息类型和消息大小的结构体,例:

struct msgbuf
{
long mtype; /*消息的类型,必须大于0 */
char mtext[]; /* 传输的数据 */
};

以下几个是于消息队列有关的函数:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> int msgget(key_t key, int msgflg);/*
功能:创建或获取消息队列
msgflg: 创建时 IPC_CREAT | IPC_EXCL | 0751(权限)
获取时 0
*/
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);/*
功能:向消息队列发送消息
msqid:msgget的返回值
msgp: 消息(消息类型+消息的内容)的首地址,如上的结构体
msgsz:消息内容的长度(不包括消息类型)
msgflg:
MSG_NOERROR: 当消息的实际长度比msgsz还要大,不产生错误,把消息按照长度截取发送*/ ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);/*
功能:从消息队列接收消息
msgp:存储消息的缓冲区
msgsz:要接收的消息长度
msgtyp:消息的类型(它包含在消息的前四个字节)
msgflg
IPC_NOWAIT:如果要接收的消息不存在,则不等待
MSG_EXCEPT:从消息队列中接收第一个不是msgtype类型的第一个消息。*/ int msgctl(int msqid, int cmd, struct msqid_ds *buf);/*
功能:控制/销毁消息队列
cmd: IPC_STAT:获取消息队列的属性
IPC_SET:设置消息队列的属性
IPC_RMID:删除消息队列*/

UNIX环境C语言进程通信的更多相关文章

  1. UNIX环境C语言进程控制

    一.进程ID 进程ID即是进程标识,每一个进程都会有一个唯一的非负整数来作为它的进程ID. ID为0的进程通常是调度进程,也可称为交换进程,该进程是内核的一部分,不执行硬盘上的程序,因此也被称为系统进 ...

  2. UNIX环境高级编程——进程管理和通信(总结)

    进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程   动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合  是个文件,可直观看到 程序program ...

  3. UNIX环境高级编程——进程基本概述

    一.什么是进程 从用户的角度来看进程是程序的一次执行过程.从操作系统的核心来看,进程是操作系统分配的内存.CPU时间片等资源的基本单位.进程是资源分配的最小单位.每一个进程都有自己独立的地址空间与执行 ...

  4. UNIX环境高级编程——进程控制

    一.进程标识符 ID为0的进程是调度进程,常常被称为交换进程.该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程.进程ID 1通常是init进程,在自举过程结束时由内核调用.ini ...

  5. UNIX环境高级编程——进程关系

    一.终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们 ...

  6. UNIX环境高级编程——进程环境

    一.main函数 C程序总是从main函数开始.当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址--这是由连接编译器设置的,而连接编译器则由 ...

  7. Unix环境高级编程—进程关系

    终端登录 网络登录 进程组 getpgrp(void) setpgid(pid_t pid, pid_) 会话: 是一个或多个进程组的集合,通常由shell的管道将几个进程编成一组. setsid(v ...

  8. Unix环境高级编程—进程控制(二)

    一.函数wait和waitpid 今天我们继续通过昨天那个死爹死儿子的故事来讲(便于记忆),现在看看wait和waitpid函数. #include<sys/wait.h> pid_t w ...

  9. 高级UNIX环境编程7 进程

    每个程序都会收到一张环境表 extern char **environ; c程序的存储空间布局: 正文段:共享,只读 初始化数据段:存函数以外的赋值 非初始化数据段(bbs):block starte ...

随机推荐

  1. 【微服务】Dubbo初体验

    一.前言 之前微服务这块只用过SpringCloud搭建,但是最近面试会被问到dubbo框架,虽然之前也学了但是都忘了,故写此博客加深印象. 二.原理简介 Dubbo是一个分布式服务框架,以及阿里巴巴 ...

  2. eclipse打开jsp的方式怎么设置成默认

    https://jingyan.baidu.com/article/4ae03de34137be3eff9e6b93.html

  3. mysql(MySQL客户端连接工具)

    在MySQL提供的工具中,DBA使用最频繁的莫过于mysql.这里的mysql不是指MySQL服务,也不是mysql数据库,而是连接数据库的客户端工具.类似于Oracle的sqlplus. 语法: m ...

  4. 初始Mybatis,好累,自己感觉自己快坚持不了了

    Mybatis1.持久化 持久化,就是内存数据和硬盘数据状态的转换 2.ORM思想Object Relation Mapping 对象关系映射 3.MyBatis入门案例 3.1导入jar包 依赖 & ...

  5. vim编辑器高级应用

    1. vim主要模式介绍 命令模式.命令行模式.编辑模式 字符操作:i 当前插入, I行首插入, a当前字符之后插入,A行首插入, ESC退出当前模式 2. vim命令模式 3. vim插入模式 4. ...

  6. 2013上半年中国CRM市场分析报告

    经过了十多年的风风雨雨,CRM度过了漫长的市场培育期,即将迎来成熟期.目前这一阶段也是CRM惨烈搏杀的一个阶段,据不完全统计,国内大大小小的CRM厂商已经超过600家,各厂商几度火拼,努力扩大自己在C ...

  7. cookie和session基础以及在Django中应用

    看了会视频,终于搞懂了~ 1.cookie cookie:保存状态 cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地:当浏览器再次访问时,浏览器会自动带上cookie,这样服务器 ...

  8. SPOJ KATHTHI - KATHTHI(01BFS)

    题意 给出一个$n \times m$的网格,每个位置有一个小写字母,初始在$(1, 1)$,每次可以向上下左右走,问走到$(n, m)$的最小花费 设$(x, y)$为当前位置,$(nx, ny)$ ...

  9. jQuery1.6.1源码分析系列(作者:nuysoft/高云)

    作者:nuysoft/高云 QQ:47214707 Email:nuysoft@gmail.com jQuery源码分析(版本1.6.1) 00 前言开光 01 总体架构 02 正则表达式-RegEx ...

  10. AngularJs数据绑定原理

    注 这篇博文主要是写给新手的,是给那些刚刚开始接触Angular,并且想了解数据帮定是如何工作的人.如果你已经对Angular比较了解了,那强烈建议你直接去阅读源代码. Angular用户都想知道数据 ...