进程通信:
终端:sigqueue:新的发送信号和消息的函数类似于kill
无名管道:父子间mkfifo
守护进程:
会话:用户
会话其:对应一个用户,从一个用户的登陆到注销
进程组:一个会话其利诱多个进程组,一个进程组分为多个进程
终端:一个会话可以有一个中断或没有,在有的前提下,所以就会有一个千台进程组,所有的进成都依赖于该中断,中断关闭,进程都结束,
状态里代价好的是前台。
守护进程:
==========================================================
进程间通信:
共享内存:速度快,内存里开辟一块共享空间,所有进程都可访问
消息队列:缓冲区
信号量级:
7500 + 1200 = 8700
Ipc机制:posix机制
一. 共享内存
a) 映射机制
i. 将文件映射为地址空间里,对地址操作 实际 就是对文件操作
ii. mmap(起始地址(NULL的话是系统分配),文件长度,期待获取的操作(读写执行),读写是否影响源文件,文件描述符,文件起始偏移量)
--期待获取的操作:执行(PORT_EXEC) 读(PORT_READ) 写(PORT_WRITE)
iii. 特别注意:映射的文件里不能为空,因为不能扩大源文件,只能读或修改,不能增加内容,不一定从头开始映射,不一定全部映射
iv. 返回值:返回起始地址
1. 打开文件
2. 文件映射(不一定全部映射)
3. Scanf memcpy è写操作 mem头文件:string
4. 解除映射mummap()
5. 关闭文件
b) 键值:
i. 用于标识 共享内存、消息队列、信号量集,保证不同的进程都能找到同一个
ii. 创建:ftok(路径名,任意数) 返回一个整数,只要两个参数相同,返回值就一样
c) 创建共享内存,就像是全局变量一样,声明(映射)后即可使用
d) 注意使用完毕以后要 解除映射 删除共享内存 注册退出函数
i. 创建: mid:共享内存专用ID
mid=shmget(键值(IPC_PRIVATE(0)只用于父子之间),大小,没有的话新建)(新建或打开)
ii. 映射:首地址 = shmat(mid , NULL(地址),0);
iii. 写入:memcpy();
iv. 分离/解除映射:shmdt(首地址);
v. 删除:shmctl(mid,命令,buf(如果删除这个参数为NULL)),所以mid得是全局的
命令:IPC_STAT获取共享内存属性(第三个参数) IPC_SET修改共享内存 IPC_RMID删除(第三个位NULL) (NULL)
e) Ipcs用于查看:三者的资源、
===============================================-=====
二. 信号量集:用于同步和互斥
a) 当访问共同资源的时候 信号量:小于零的时候,才能访问信号两级的id 第几个(从零开始),命令
b) 打开的时候为零。
c) Cmd是执行的操作
d) 设置多个信号量的操
三. 消息队列(队列的使用,必须要遵循 先创建è发送/接收è删除 三步走
一般用于发送方和接收方速度不同步的情况,一般是接收方阻塞等待
a)
b) Ftok(“路径”,整数) 返回值:key_t 即唯一的键值,用于标识消息队列和IPC
c) Msgget(键值,操作)
1. 如果创建,IPC_CREAT
2. 如果要打开,就0,
3. 返回值:打开或者创建的消息队列的 ID int类型的 打开失败 就-1
d) Msgctl(消息队列id , 操作 , NULL):常常用来删除 队列
1. 操作:IPC_RMID 标识删除
e) Msgsnd(队列id ,结构体(消息)的指针,消息大小(减去4以后),阻塞(0)/非阻塞(IPC_NOWAIT)):
1. 消息结构体:struct msgp:
a) 第一个成员固定为long类型的 mtype(消息的类型,接收函数据此判断是否接受) 好处是不同的进程可以共用一个消息队列。
b) 实际的内容 其大小为sizeof(msgp) – sizeof(long)
f) Msgrcv(id ,接收结构体,大小,类型,是否阻塞): 从消息队列里取出信息
消息类型一般指定为 0~5,可用于不同的进程