1.信号
进程间通信 -->信号通信
应用:异步通信。 中断
进程间通信方式:
管道:进程间数据通信
信号: 进程间通信,用来发送通知(异步通信,中断)
同步通信:发送端和接收端,使用同一时钟通信
异步通信:发送端和接收端使用不同时钟通信
同步通信:按照指定的顺序进行运行
异步通信:一种随机事件,在程序编写阶段不能够确定事件发生的时机
1.信号发送方:
1.signal
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:
注册一个信号并设置信号的处理方式
参数:
signum:信号的编号
handler:信号的处理方式
函数入口 捕获
SIG_IGN 忽略
SIG_DFL 缺省
信号对应的处理函数地址
返回值:
成功返回上一次注册的信号处理函数
失败返回SIG_ERR
2.kill
int kill(pid_t pid, int sig);
功能:
给进程发送信号
参数:
pid:进程的ID号
sig:信号的ID号
返回值:
成功返回0
失败返回-1
3.raise
int raise(int sig);
功能:
给调用该函数的进程发送sig信号
4.alarm
unsigned int alarm(unsigned int seconds);
功能:
间隔seconds秒后给调用进程发送一个SIGALRM信号
参数:
seconds:秒数
返回时:
成功返回上次设定剩余的时间
上次未设定则返回0
5.pause
int pause(void);
功能:
让调用该函数的进程挂起
当进程收到信号时(必须被捕获),pause被唤醒
2.信号接收方:
每个进程都会对信号做出默认响应,但是不是唯一响应。
一般对信号的处理方法有三种:
=================================================
缺省:按照操作系统默认方式处理信号
忽略:不响应信号
捕获:按照用户自定义的方式处理信号
=================================================
9 SIGKILL
19 SIGSTOP
不能被忽略和捕捉
2.共享内存
进程间通信最高效的形式
1.获取key值 ftok
key_t ftok(const char *pathname, int proj_id);
功能:通过该函数可以将pathname指定的路径用来以
proj_id生成唯一的临时键值。
参数:pathname 路径 ,任意路径,只要不会被删除即可。但是读写端路径指向必须一致
proj_id 代号,整形的数据,一般用ASCII码的单字符表示
返回值:成功 返回唯一键值
失败 -1;
2.申请对象 shmget
int shmget(key_t key, size_t size, int shmflg);
功能:
创建共享内存
参数:
key:键值
size:共享内存大小
shmflg:
IPC_CREAT | 0664 创建 (低9个bits表示用户,同组用户,其他人的权限)
IPC_EXCL 检测是否存在
返回值:
成功返回共享内存ID
失败返回-1
3.内存映射 shmat
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:将指定shmid对应的共享内存映射到本地内存。
参数:shmid 要映射的共享内存id
shmaddr 本地可用的地址,如果不确定则用NULL,表示
由系统自动分配。
shmflg :操作权限
SHM_RDONLY,只读
!SHM_RDONLY 读写
返回值:成功 返回映射的地址,一般等于shmaddr
失败 (void*)-1
读写共享内存:类似堆区内存的直接读写:
char * p ;
write(fd,p,);
read(fd,p,1024);
memcpy(p,buf,1024);strcpy();
memset(p,0,1024);== bzero(p,1024);
memcmp(p,buf,1024); strcmp(a,b);
4.解除映射:shmdt
int shmdt(const void *shmaddr);
功能:将本地内存与共享内存断开映射关系。
参数:shmaddr 要断开的映射地址。
返回值:成功 0
失败 -1;
5.删除对象:shmctl
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:修改共享内存属性,也可以删除指定的共享内存对象。
参数:shmid 要删除的共享内存对象
cmd
IPC_STAT 获得信息
IPC_SET 设置权限
IPC_RMID 删除
buff
NULL 表示只删除对象。
返回值:成功 0
失败 -1
ipcs -a 查询共享内存,信号量集,消息队列
ipcrm -s 删除信号量集
-m 删除共享内存
ipcrm -m shmid
ipcrm -M shmkey
俩进程之间的传输:
进阶:(通过信号传输,一个进程接收,一个进程输出,当输入“quit”时,俩进程都结束)